Unity Editor - DrawDefaultInspector不起作用

时间:2015-05-21 13:40:57

标签: c# unity3d unity3d-editor

我正在尝试编写一个简单的编辑器扩展,仅用于学习目的。此扩展只会检查目标是否是JSON文件,然后计算它的键或执行其他任意任务。

这是默认情况下检查器的外观。 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 个答案:

答案 0 :(得分:2)

我认为问题是TextAsset不使用普通的编辑器类进行检查。许多内置的统一类使用特殊的内置编辑器类,这是非公开的

您可以尝试将[CustomEditor(typeof(TextAsset))]更改为[CustomEditor(typeof(Transform))][CustomEditor(typeof(Animator))],以查看" Real Default Inspector"变换和动画制作者与普通人不同

所以如果你想制作任何自定义编辑器。不要关心默认检查员。从头开始吧。祝你好运

答案 1 :(得分: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的未来版本中不起作用。