うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】DefaultAsset の Inspector拡張

UnityVersion

2018.4.14f1

DefaultAsset の Inspector 作成

[CustomEditor(typeof(DefaultAsset))] を定義することで DefaultAsset のInspector拡張を行える

Unity2017くらいだと Scene ファイルも DefaultAsset 扱いだった記憶があるが、現在では SceneAsset となっており
DefaultAsset では取得することができなかった

Unity 2019.2の不具合

Unity 2019.2では不具合で CustomEditor で DefaultAsset を指定しても OnInspectorGUI が呼ばれない不具合が発生しているようです
2019.3 で Unity の UI が変わるのでその影響があるのでしょうか?

そのため 2019.* では DefaultAsset の CustomEditor はまだ使わないほうがいいかもしれません
https://forum.unity.com/threads/oninspectorgui-not-being-called-on-defaultasset-in-2019-2-0f1.724328/

コード

複数の拡張をしたい場合があるので、abstract class を用意して それを継承したものを表示するように作成しました

   [CustomEditor(typeof(DefaultAsset))]
    public class DefaultAssetInspector : Editor
    {
        private DefaultAssetInspectorAbstract[] targetInspectors = new DefaultAssetInspectorAbstract[0];
 
        private void OnEnable()
        {
            targetInspectors = AppDomain.CurrentDomain
                .GetAssemblies()
                .SelectMany(a => a.GetTypes())
                .Where(t => t.BaseType == typeof(DefaultAssetInspectorAbstract))
                .Select(t => Activator.CreateInstance(t) as DefaultAssetInspectorAbstract)
                .ToArray();

            foreach (var inspector in targetInspectors)
                inspector.Enable();
        }
 
        private void OnDisable()
        {
            foreach (var inspector in targetInspectors)
                inspector.Disable();
        }
 
        public override void OnInspectorGUI()
        {
            if (targetInspectors.Length <= 0)
                return;
            
            foreach (var inspector in targetInspectors)
                if (inspector.IsValid(target, AssetDatabase.GetAssetPath(target)))
                    inspector.InspectorGUI(target);
        }
    }
     
    public abstract class DefaultAssetInspectorAbstract
    {
        public abstract void Enable();
 
        public abstract void InspectorGUI(UnityEngine.Object target);
 
        public abstract void Disable();
 
        public abstract bool IsValid(UnityEngine.Object target, string path);
    }

現状はフォルダ以外なにが DefaultAsset なのかわからないため、フォルダのみしかやってませんが フォルダの場合に Inspector を拡張するクラスが以下になります

f:id:hacchi_man:20200111022534p:plain

   public class DirectoryAssetInspector : DefaultAssetInspectorAbstract
    {
        public override void Enable()
        {
        }

        public override void InspectorGUI(UnityEngine.Object target)
        {
            EditorGUILayout.LabelField("Folder");
        }

        public override void Disable()
        {
        }

        public override bool IsValid(UnityEngine.Object target, string path)
        {
            return AssetDatabase.IsValidFolder(path);
        }
    }