Unity3d 自定义窗口上的统一自定义检查器

Unity3d 自定义窗口上的统一自定义检查器,unity3d,Unity3d,我有一个显示对象列表的自定义窗口。每个对象都有一个自定义检查器编辑器 是否可以在自定义窗口中显示自定义检查器?您不能强制Unity3D在检查器窗口之外的其他位置绘制自定义检查器 顺便说一句,您可以使用方法手动安装编辑器。 由于您正在显示自定义检查器,因此应该可以从Window.OnGUI方法内部手动实例化它,并使用编辑器的publicOnInspectorGUI方法在窗口内绘制编辑器 例如,如果您已将名为CustomScript的脚本附加到GameObject并具有名为CustomScriptE

我有一个显示对象列表的自定义窗口。每个对象都有一个自定义检查器编辑器


是否可以在自定义窗口中显示自定义检查器?

您不能强制Unity3D在检查器窗口之外的其他位置绘制自定义检查器

顺便说一句,您可以使用方法手动安装
编辑器
。 由于您正在显示自定义检查器,因此应该可以从
Window.OnGUI
方法内部手动实例化它,并使用编辑器的public
OnInspectorGUI
方法在窗口内绘制编辑器

例如,如果您已将名为
CustomScript
的脚本附加到
GameObject
并具有名为
CustomScriptEditor
的相关
编辑器,假设您已从层次结构中选择了
GameObject
,则此代码会在
EditorWindow
中可视化自定义检查器:

using UnityEditor;
using UnityEngine;


public class TestWindow : EditorWindow
{

    [MenuItem ("Window/Editor Window Test")]
    static void Init () 
    {
        // Get existing open window or if none, make a new one:
        TestWindow window = (TestWindow)EditorWindow.GetWindow (typeof (TestWindow));
    }

    void OnGUI () {

        GameObject sel = Selection.activeGameObject;

        CustomScript targetComp = sel.GetComponent<CustomScript>();

        if (targetComp != null)
        {
            var editor = Editor.CreateEditor(targetComp);
            editor.OnInspectorGUI();            
        }

    }
}
使用UnityEditor;
使用UnityEngine;
公共类测试窗口:EditorWindow
{
[菜单项(“窗口/编辑器窗口测试”)]
静态void Init()
{
//获取现有的打开窗口,如果没有,则创建一个新窗口:
TestWindow window=(TestWindow)EditorWindow.GetWindow(typeof(TestWindow));
}
void OnGUI(){
GameObject sel=Selection.activeGameObject;
CustomScript targetComp=sel.GetComponent();
如果(targetComp!=null)
{
var editor=editor.CreateEditor(targetComp);
OnInspectorGUI();
}
}
}

目前为止,这个问题是谷歌搜索“Unity inspector inside editor window”等查询的最佳结果,因此我发了一篇帖子,分享我在几个小时的挫折中学到的一些非常重要的信息:

我正在构建一个编辑器工具,它利用EditorWindow中的自定义检查器,我使用了与Heisenbug完全相同的方法。在使用该工具时,我的控制台偶尔会遇到数百个神秘的空引用异常。重新团结会让他们离开,但他们不可避免地会回来。我终于能够将问题追溯到“Editor.CreateEditor”,以下是我通过艰难的方式学到的教训:

您需要手动销毁从Editor.CreateEditor创建的任何检查器

通常,Unity会在选择相关对象时实例化一个检查器,并在取消选择/删除该对象时自动销毁该实例。但是,通过Editor.CreateEditor创建的检查器将永远不会被销毁,并且将在其所检查的对象被销毁后在内存中的某个位置停留很长时间

您可以通过向自定义检查器添加以下代码来证明这一点:

void OnEnable()
{
    Debug.Log("on enable " + this.GetInstanceID());
}

void OnDisable()
{
    Debug.Log("on disable " + this.GetInstanceID());
}
通常使用inspector,在创建和销毁inspector实例时,您将始终成对地看到这些消息。但是,尝试从EditorWindow类实例化一些检查器,您将只看到“启用”消息

我了解到Unity在重新编译脚本时调用OnEnable()。尝试一下,您将看到控制台中充满了来自所有从未清理过的检查器实例的“启用”消息。这些实例将在它们所检查的对象被销毁后很长一段时间内仍然存在,并且OnEnable()中的任何初始化代码都将以惊人的速度崩溃,引发大量神秘的异常

我的解决方案看起来像这样(这段代码将放在您的EditorWindow类中):

Editor embeddedInspector;

...

// a helper method that destroys the current inspector instance before creating a new one
// use this in place of "Editor.CreateEditor"
void RecycleInspector(Object target)
{
    if (embeddedInspector != null) DestroyImmediate(embeddedInspector);
    embeddedInspector = Editor.CreateEditor(target);
}

...

// clean up the inspector instance when the EditorWindow itself is destroyed
void OnDisable()
{
    if (embeddedInspector != null) DestroyImmediate(embeddedInspector);
}

伟大的与beginscrollview一起工作也很好!