【Unity】ジェネリック型のCustomEditor

エディタ拡張を行っている時にあるジェネリクス型のクラスのInspectorを変更したい時がありその時の知見です。

対象のクラス

例えばベースクラスとして次のようなクラスを定義しました。

public class HogeBase<T> : MonoBehaviour
{
    [SerializeField]
    private T _value;
    
}

継承したクラスはこのような感じになります。

public class HogeChild : HogeBase<float>
{

}

f:id:albatrus:20211208150715p:plain
Inspector

こちらのInspectorを拡張したい場合。

[CustomEditor(typeof(HogeBase<>),true)]
public class HogeInspector : Editor
{
    private SerializedProperty _scriptProperty;
    private SerializedProperty _valueProperty;

    private void OnEnable()
    {
        _scriptProperty = serializedObject.FindProperty("m_Script");
        _valueProperty = serializedObject.FindProperty("_value");
    }

    public override void OnInspectorGUI()
    {
        using (new EditorGUI.DisabledScope(true))
        {
            EditorGUILayout.PropertyField(_scriptProperty);
        }

        EditorGUILayout.PropertyField(_valueProperty, new GUIContent("値 "));
        
        serializedObject.ApplyModifiedProperties();
    }
}

f:id:albatrus:20211208154918p:plain
CustomEditorでInspectorを編集

CustomEditor

ジェネリクスを指定する場合には次のように指定します。 また継承先のクラスのCustomEditorの対象にするためには、第2引数をtrueにしてあげます。

[CustomEditor(typeof(HogeBase<>),true)]

複数のジェネリクスを格納する場合

次のように2つのジェネリクスの型があった場合

public class HogeBase<T,TValue> : MonoBehaviour
{
    [SerializeField]
    private T _value;
    
    [SerializeField]
    private TValue _value2;
    
}

カンマを使って指定ができます。

[CustomEditor(typeof(HogeBase<,>),true)]