CustomVolumeParameterとインスペクターのエディタ拡張(Volume Component)

CustomVolumeParameterとインスペクターのエディタ拡張(Volume Component)

CustomVolumeParameter

 VolumeComponentで利用できるVolumeParameterは予め用意されているものがあります。しかし、enumのように既存のVolumeParameter以外のParameterを利用したい場合があります。この場合、VolumeParameterを継承したクラスを作成し、新たにVolumeParameterを作成する必要があります。

Script

  以下はenumのVolumeParameterを追加するためのScriptです。

using UnityEngine.Rendering;
using System;

namespace Karakan
{
    public enum Select
    {
        A = 0,
        B = 1
    }

    [Serializable]
    public class BlendingParameter : VolumeParameter<Select>
    {
        public BlendingParameter(Select value, bool overrideState = false) : base(value, overrideState) { }
    }
}

 このVolumeParameterを使用すると、以下のようにVolumeComponentでenumが利用できます。

インスペクターのエディタ拡張(Volume Component)

 通常、インスペクターのカスタムを行う際にはEditorを継承したクラスを利用します。しかし、VolumeComponentの場合はEditorではなくVolumeComponentEditorを継承したクラスを作成する必要があります。

Script

 VolumeComponentEditorを利用して、VolumeComponentのインスペクターをカスタムするScriptです。以下のScriptではenumの値によって表示するLabelが変更されます。

using UnityEngine.Rendering;
using UnityEngine.Rendering.Universal;
using UnityEditor;
using UnityEditor.Rendering;

namespace Karakan
{
    public class CustomVolumeComponent : VolumeComponent, IPostProcessComponent
    {
        public CustomeVolumeParameter customParameter = new CustomeVolumeParameter(Select.A, true);

        public bool IsActive()
        {
            return true;
        }

        public bool IsTileCompatible()
        {
            return false;
        }
    }

    [VolumeComponentEditor(typeof(CustomVolumeComponent))]
    public class CustomVolumeInspector : VolumeComponentEditor
    {
        CustomVolumeComponent _volume = null;
        SerializedDataParameter _custom_parameter;

        public override void OnEnable()
        {
            base.OnEnable();

            _volume = target as CustomVolumeComponent; //VolumeComponentの取得

            //SerializedDataParameterの取得
            var o = new PropertyFetcher<CustomVolumeComponent>(serializedObject);
            _custom_parameter = Unpack(o.Find(x => x.customParameter));
        }

        public override void OnInspectorGUI()
        {
            PropertyField(_custom_parameter); //CustomeVolumeParameterの表示

            Select select = _volume.customParameter.value; //CustomeVolumeParameterの値を取得

            //CustomeVolumeParameterの値によってLabelを変更
            switch (select)
            {
                case Select.A:
                    EditorGUILayout.LabelField("A is selected.");
                    break;

                case (Select.B):
                    EditorGUILayout.LabelField("B is selected.");
                    break;
            }
        }
    }
}

上記Scriptを使用した結果は以下の通りです。enumの選択によってラベルの変更ができています。

参考ページ

Unity:Scripting API/Unity​Engine.​Rendering/Volume​Parameter<T>

Unity:Scripting API/Unity​Editor.​Rendering/Volume​Component​Editor