Unity UniversalRenderPipelineAsset&Data 변경

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>");
        }

    }
}

댓글 달기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

위로 스크롤