【unity】ScrollRectを継承したクラスのpublic変数をInspectorに表示するEditor拡張

ScrollRectを継承して無限スクロール、多重スクロールなどを実装しようとしたときに継承先のpublicやSerializeFieldの変数がInspectorに表示されなかったのでEditor拡張で表示させてみました。


using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

namespace Custom.UI
{

    public class CustomScrollRect : ScrollRect
    {
        public Transform test;
        public GameObject hoge01;
        [SerializeField]private GameObject hoge02;
        public GameObject[] hoge03;
        public List<GameObject> hoge04;
    }

}

testやhoge01などが表示されていないので

継承をうまく用いて表示させてみる

ScrollRectEditor.csを継承したEditor拡張つくれば元の表示を保ったままうまく表示できます。

using UnityEngine;
using System;
using System.Reflection;
using UnityEditor;
using UnityEditor.UI;
using Custom.UI;

namespace Custom
{

    [CanEditMultipleObjects]
    [CustomEditor(typeof(CustomScrollRect), true)]
    public class CustomScrollRectEditor : ScrollRectEditor
    {
        public override void OnInspectorGUI()
        {
            serializedObject.Update();

            if (serializedObject.targetObject is CustomScrollRect customScrollRect)
            {
                Type classType = customScrollRect.GetType();
                FieldInfo[] fieldInfos =  classType.GetFields(BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.Public | BindingFlags.DeclaredOnly);
                for (int i = 0; i < fieldInfos.Length; i++)
                {
                    FieldInfo fieldInfo = fieldInfos[i];
                    object[] attributes = fieldInfo.GetCustomAttributes(true);
                    bool isSerializeField = false;
                    foreach (var attribute in attributes)
                    {
                        if (attribute.GetType() == typeof(SerializeField))
                        {
                            isSerializeField = true;
                            break;
                        }
                    }
                    if (fieldInfo.Attributes != FieldAttributes.Public && !isSerializeField) continue;
                    SerializedProperty serializedProperty = serializedObject.FindProperty(fieldInfo.Name);
                    EditorGUILayout.PropertyField(serializedProperty);
                }
            }

            serializedObject.ApplyModifiedProperties();

            // 区切り線
            GUILayout.Box("", GUILayout.ExpandWidth(true), GUILayout.Height(2));

            base.OnInspectorGUI();


        }
    }
}

終わりに

ほかにもすでにEditor拡張されているクラスを継承したときにはこの方法を使えばうまく表示できるはずです。

コメント