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 を拡張するクラスが以下になります
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); } }