由于我不确定您在问什么,这里有多种不同的解决方案;
选择
如果你只是想让你的节点成为层次结构的焦点,那么在你自定义窗口的 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#下面)。
(我在 UnityEditor 和 UnityEditorInternal 命名空间中进行了相当广泛的查看,但找不到 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();
}
}
抱歉,如果这不是您要查找的内容,如果不是,请提供更多详细信息,我将修改我的答案以更好地适应问题。
希望这会有所帮助。