手动打开可序列化对象的自定义检查器

Manually Open custom inspector for serializable object

我有一个包含节点的 window 编辑器。当这些节点之一被 selected 时,我想打开一个自定义检查器。节点 class 是自定义可序列化 class。这可能吗?

似乎可以通过 Editor.CreateEditor 方法手动创建自定义检查器,但在 unity 检查器中看不到如何让它像普通检查器一样停靠 window.

我想实现与 select 场景视图中的游戏对象相同的行为,该对象会立即在统一检查器中显示对象(组件等)的属性。

干杯

由于我不确定你在问什么,这里有多种不同的解决方案;

选择

如果您只想让您的节点成为层次结构的焦点,那么在您自定义的 window 的 OnGUI 方法中,使用下面的代码;

[CustomEditor(typeof(NodeManager))]
public class NodeManager : EditorWindow
{
    private static  NodeManager window;
    private         Node[]      m_nodes;

    [MenuItem("Custom Windows/Node Inspector")]
    public static void Init()
    {
        if(window == null)
            window = GetWindow<NodeManager>("Node Manager", true, typeof(SceneView));
    }

    public void OnGUI()
    {
        m_nodes = GameObject.FindObjectsOfType<Node>();

        foreach(Node node in m_nodes)
        {
            GUILayout.BeginHorizontal();
            {
                GUILayout.Label(node.name);
                if (GUILayout.Button("Select"))
                    Selection.objects = new Object[] { node.gameObject };
            }
            GUILayout.EndHorizontal();
        }
    }
}

这会在您的自定义 window 视图中为每个对象添加一个按钮,然后 select 该对象会出现在层次结构中。

自动对接

我原来是找到了this问题的第二个回复,其中详细介绍了GetWindow方法的参数,这样你就可以清楚地看到如何对接window(我'下面已经将它从 JS 转换为 C#)。 (我相当广泛地查看了 UnityEditorUnityEditorInternal 命名空间,但找不到层次结构或检查器)。

GetWindow<T>(string title, bool focus, params System.Type[] desiredDockNextTo)

对于这个例子我们可以写成;

EditorWindow.GetWindow<NodeInspector>("Node Test", true, typeof(SceneView));

此示例将 windows 停靠在 SceneView window 旁边。此功能可以与自定义检查器的 OnInspectorGUI 方法结合使用,以自动启动自定义节点 window、if it's not already open.

[CustomEditor(typeof(Node))]
public class NodeInspector : Editor
{
    public override void OnInspectorGUI()
    {
        base.OnInspectorGUI();
        NodeManager.Init();
    }
}

抱歉,如果这不是您要查找的内容,如果不是,请提供更多详细信息,我会修改我的答案以更好地适应这个问题。 希望这对您有所帮助。

有一种可能,你可以为它制作一个自定义的ScriptableObject和Custom Editor,当打开节点检查器时,只需找到一个脚本对象的实例并使用Selection.selectedObject = scriptableObject,并在自定义编辑器,创建一个名为 'editor' 的静态字段以在其中绘制。 它会起作用。