【问题标题】:Manually Open custom inspector for serializable object手动打开可序列化对象的自定义检查器
【发布时间】:2018-05-29 07:53:39
【问题描述】:

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

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

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

干杯

【问题讨论】:

  • 你能贴一张你的节点编辑器的截图吗?我不完全确定您在寻找什么。
  • 对不起,我不能。我仍在构建逻辑层。但问题只是......如果我有一个编辑器窗口,是否有可能在统一检查器窗口中显示给定类型的检查器?在我的例子中,我有一个类节点,当我单击编辑器窗口中的节点时,我想显示自定义节点检查器,就​​像单击游戏对象时 Unity 所做的那样。

标签: unity3d unity5 unity3d-editor unity3d-5


【解决方案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();
        }
    }
}

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

自动停靠

我最初找到了this问题的第二个回复,详细介绍了GetWindow方法的参数,通过这个你可以清楚地看到如何停靠窗口(我已经将它从JS转换为C#下面)。 (我在 UnityEditorUnityEditorInternal 命名空间中进行了相当广泛的查看,但找不到 Hierarchy 或 Inspector)。

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();
    }
}

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

【讨论】:

  • 我投了赞成票,因为您花时间为帖子带来了很多信息,但这不是我要找的东西。正如你所说,我可以在我的编辑器窗口上画一个检查器。但我想为此使用内置的检查器窗口(统一使用的)。
  • 您的节点管理器是否只包含节点类列表,而不是在与节点管理器相同的窗口中查看此脚本的详细信息,而是希望它们在单独的窗口中?
【解决方案2】:

有可能,你可以为它制作一个自定义的ScriptableObject和自定义编辑器,当打开节点检查器时,只需找到一个可编写脚本对象的实例并使用Selection.selectedObject = scriptableObject,然后在自定义编辑器中制作一个称为“编辑器”的静态字段在里面绘制。 它会起作用的。

【讨论】:

    猜你喜欢
    • 2019-03-24
    • 2012-09-20
    • 1970-01-01
    • 1970-01-01
    • 2020-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多