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

时间:2016-03-11 12:27:10

标签: unity3d unity5 unity3d-editor unity3d-5

我有一个保存节点的窗口编辑器。我想在选择其中一个节点时打开自定义检查器。节点类是自定义可序列化类。这可能吗?。

似乎可以通过Editor.CreateEditor方法手动创建自定义检查器,但无法看到如何让它像统一检查器窗口中的常规检查器一样停靠。

我希望实现与在sceneview中选择一个游戏对象时相同的行为,该对象在团结检查器中显示对象的属性(组件等)。

干杯

2 个答案:

答案 0 :(得分:1)

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

选择

如果您只想让节点成为层次结构的焦点,那么在自定义窗口的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();
        }
    }
}

这会在自定义窗口视图中为每个对象添加一个Button,然后在层次结构中选择该对象。

自动对接

我最初找到了对this问题的第二个回复,其中详细介绍了GetWindow方法的参数,有了这个,您可以清楚地看到如何停靠窗口(我已将其从JS转换为C#如下)。 (我在UnityEditorUnityEditorInternal命名空间中看得相当广泛,但找不到层次结构或检查器。

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

我们可以为此示例编写;

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

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

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

很抱歉,如果这不是你想要的,如果不是,那么请提供更多细节,我会修改我的答案,以更好地适应这个问题。 希望这有帮助。

答案 1 :(得分:1)

有可能,您可以为它创建自定义ScriptableObject和自定义编辑器,并且在打开节点检查器时,只需找到可编写脚本的对象的实例并使用Selection.selectedObject = scriptableObject,并在自定义编辑器中创建一个静态字段称为编辑器&#39;在里面画画。 它会起作用。