using UnityEngine; using UnityEngine.Rendering.Universal; using UnityEngine.Rendering; using System.Reflection; public class UniversalRenderPipelineSetting : MonoBehaviour { [SerializeField] UniversalRenderPipelineAsset URPPerformant; [SerializeField] UniversalRenderPipelineAsset URPBalanced; [SerializeField] UniversalRenderPipelineAsset URPHighFidelity; [SerializeField] UniversalRenderPipelineAsset URPOne; private void Awake() { Get_CurrentUniversalRenderPipelineAsset(); Change_UniversalRenderPipelineAssetSetting(); } void Get_CurrentUniversalRenderPipelineAsset() { // 현재 UniversalRenderPipelineAsset을 확인 UniversalRenderPipelineAsset _UniversalRenderPipelineAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; Debug.Log($"<color=red>{_UniversalRenderPipelineAsset.name}</color>"); // UniversalRenderPipelineAsset을 URP-Balanced로 변경 QualitySettings.renderPipeline = URPBalanced; _UniversalRenderPipelineAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; Debug.Log($"<color=green>{_UniversalRenderPipelineAsset.name}</color>"); // UniversalRenderPipelineAsset을 URP-HighFidelity로 변경 QualitySettings.renderPipeline = URPHighFidelity; _UniversalRenderPipelineAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; Debug.Log($"<color=blue>{_UniversalRenderPipelineAsset.name}</color>"); } void Change_UniversalRenderPipelineAssetSetting() { // UniversalRenderPipelineAsset을 URPOne으로 변경 QualitySettings.renderPipeline = URPOne; UniversalRenderPipelineAsset _UniversalRenderPipelineAsset = GraphicsSettings.currentRenderPipeline as UniversalRenderPipelineAsset; Debug.Log($"<color=green>{_UniversalRenderPipelineAsset.name}</color>"); // UniversalRenderPipelineAsset 변경 확인 // URP Renderer List 리플렉션 참조 (Internal 변수라서 그냥 참조 불가능) // 리플렉션(Reflection)은 C#에서 런타임 중에 객체나 타입의 정보를 조사하고 조작할 수 있는 기능 // 일반적으로 접근할 수 없는 필드나 메서드, 속성 등의 정보를 런타임에 동적으로 가져올 수 있음. // 이를 통해 코드가 실행되는 동안 타입에 대한 정보(예: 클래스 내부의 변수, 메서드)를 알아내거나 수정할 수 있음. // 이 코드에서 리플렉션 참조는 클래스의 비공개 필드를 접근하기 위해 사용 // 여기서 m_RendererDataList라는 필드는 UniversalRenderPipelineAsset 클래스의 내부(private) 필드로, 일반적으로 외부에서 접근할 수 없음. // 리플렉션을 사용하여 private 또는 internal 필드도 가져옴 // (using System.Reflection) FieldInfo propertyInfo = _UniversalRenderPipelineAsset.GetType().GetField("m_RendererDataList", BindingFlags.Instance | BindingFlags.NonPublic); // indingFlags.Instance | BindingFlags.NonPublic 의 설명 / Bindingflags // https://learn.microsoft.com/ko-kr/dotnet/api/system.reflection.bindingflags?view=net-8.0 ScriptableRendererData[] _ScriptableRendererDataList = (ScriptableRendererData[])propertyInfo.GetValue(_UniversalRenderPipelineAsset); foreach (ScriptableRendererData _ScriptableRendererData in _ScriptableRendererDataList) { Debug.Log($"<color=green> ScriptableRendererData : {_ScriptableRendererData.name}</color>"); } } }