2015-05-21 4 views
9

Я пытаюсь написать простое расширение редактора только для целей обучения. Это расширение просто проверяет, является ли цель JSON-файлом, затем подсчитывает ключи или выполняет другую произвольную задачу.Unity Editor - DrawDefaultInspector не работает

Так выглядит инспектор по умолчанию. This is how the inspector looks like by default

Затем я начал писать свой инспектор, точно так же.

[CustomEditor(typeof(TextAsset))] 
public class TestInspector : Editor 
{ 
    public override void OnInspectorGUI() 
    { 
     DrawDefaultInspector(); 
    } 
} 

Обратите внимание на вызов DrawDefaultInspector().

Теперь инспектор выглядит следующим образом.

Now the inspector looks like this.

Почему это не рисунок инспектор по умолчанию? Я понимаю, что мое расширение в основном ничего не значит, не так ли?

ответ

2

Я думаю, что проблема заключается в том, что TextAsset не использует обычный класс редактора для инспектора. Многие встроенный класс единства с помощью специального встроенный класс редактора, который не является публичной

Вы можете попробовать с изменением [CustomEditor(typeof(TextAsset))] в [CustomEditor(typeof(Transform))] или [CustomEditor(typeof(Animator))], чтобы увидеть «Real По умолчанию инспектор» по трансформации и аниматор не то же самое, как обычно один

Итак, если вы хотите создать какой-либо пользовательский редактор. Не волнует инспектор по умолчанию. Просто сделай это с нуля. Удачи

+0

Это, кажется, правильный ответ. 'DrawDefaultInspector', похоже, не обрабатывает' TextAssets', потому что для типа TextAsset существует, вероятно, частный внутренний класс редактора. – Sam

+0

Я добавил пример того, как делать то, что OP хочет использовать. – Sam

2

Если вы хотите переопределить встроенный инспектор текстовых объектов, вам придется найти его и вызвать его из собственного редактора. Класс называется UnityEditor.TextAssetInspector, но это частный внутренний класс, на который обычно можно ссылаться только Unity. Тем не менее, вы можете получить доступ к нему с помощью отражения, как это:

 
using System; 
using System.Reflection; 
using UnityEngine; 
using UnityEditor; 

[CustomEditor(typeof(TextAsset))] 
public class TestInspector : Editor 
{ 
    private Editor m_editor; 

    public override void OnInspectorGUI() 
    { 
     if (m_editor == null) 
     { 
      var assemblies = AppDomain.CurrentDomain.GetAssemblies(); 
      foreach (var a in assemblies) 
      { 
       var type = a.GetType("UnityEditor.TextAssetInspector"); 
       if (type != null) 
       { 
        m_editor = Editor.CreateEditor(target, type); 
        break; 
       } 
      } 
     } 

     if (m_editor != null) 
      m_editor.OnInspectorGUI(); 
    } 
} 

Этот поиск по всем загруженных сборок для типа UnityEditor.TextAssetInspector, а затем создает экземпляр этого для текущей цели активов. Мы используем версию Editor.CreateEditor, которая позволяет нам передавать тип создаваемого редактора, поскольку в противном случае он попытается создать экземпляр TestInspector.

Обратите внимание, что это предполагает определенные вещи о внутренности Unity и может не работать в будущих версиях Unity.

+1

Это так здорово. И я думаю, вы могли бы сделать лучше для поиска, вместо поиска типа UnityEditor.TextAssetInspector. Вы можете перебрать все типы и отфильтровать тип, который имеет атрибут CustomEditor of TextAsset, прикрепленный к – Thaina

+0

О да, конечно! И затем убедитесь, что это не тип «TestInspector», так что вы не попадаете в рекурсивный цикл. Также вышеупомянутый поиск можно ускорить, сначала обнаружив сборку UnityEditor, а не выполнив поиск по каждой сборке. Но это дает вам некоторые идеи в любом случае. – Sam

+0

Как вы узнали, какой скрытый внутренний класс использовался «TextAsset»? Как я пойду, чтобы узнать, какой из них используется, скажем, «SpriteRenderers»? – JeromeJ

Смежные вопросы