Открыть вручную настраиваемый инспектор для сериализуемого объекта

У меня есть оконный редактор, содержащий узлы. Я хотел бы открыть настраиваемый инспектор, когда выбран один из этих узлов. Класс узла - это настраиваемый сериализуемый класс. Это возможно?.

Кажется, что пользовательские инспекторы могут быть созданы вручную с помощью метода Editor.CreateEditor, но не могут видеть, как сделать так, чтобы он выглядел закрепленным, как обычный инспектор, в окне инспектора единства.

Я хотел бы добиться того же поведения, что и у нас, когда мы выбираем игровой объект в обзоре сцены, который сразу показывает свойства объекта (компоненты и т. Д.) В инспекторе единства.

Ваше здоровье


person Notbad    schedule 11.03.2016    source источник
comment
Не могли бы вы опубликовать скриншот того, как выглядит ваш редактор узлов? Я не совсем уверен, что вы ищете.   -  person Venkat at Axiom Studios    schedule 11.03.2016
comment
Извините, но я не могу. Я все еще создаю логический слой. Но вопрос только в том, что ... Если у меня есть окно редактора, есть ли возможность показать в окне Unity Inspector инспектор для данного типа? В моем случае у меня есть узел класса, и я хотел бы отображать инспектор настраиваемых узлов, когда я щелкаю узел в окне редактора, как это делает Unity, когда вы щелкаете игровой объект.   -  person Notbad    schedule 11.03.2016


Ответы (2)


Поскольку я не уверен, о чем вы спрашиваете, вот несколько разных решений;

Выбор

Если вы просто хотите, чтобы ваши узлы стали фокусом иерархии, то в методе 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();
        }
    }
}

Это добавляет кнопку для каждого объекта в вашем настраиваемом окне просмотра, которая затем выберет этот объект в иерархии.

Автоматическая стыковка

Первоначально я нашел второй ответ на этот вопрос, в котором подробно описываются параметров метода GetWindow, и с этим вы можете ясно увидеть, как закрепить окно (я преобразовал его из JS в C # ниже). (Я довольно подробно искал пространства имен UnityEditor и UnityEditorInternal, но не смог найти Иерархию или Инспектор).

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

Что мы можем написать для этого примера как;

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

В этом примере окна закрепляются рядом с окном SceneView. Эта функция может быть объединена с методом OnInspectorGUI настраиваемого инспектора для автоматического запуска окна настраиваемого узла , если он еще не открыт.

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

Извините, если это не то, что вы ищете, если это не так, опишите подробнее, и я исправлю свой ответ, чтобы он лучше соответствовал вопросу. Надеюсь, это помогло.

person MrDiVolo    schedule 17.04.2016
comment
Я проголосовал "за", потому что вы нашли время, чтобы добавить в пост много информации, но это я сопляк, то, что я ищу. Я могу, как вы сказали, нарисовать инспектора над окном моего редактора. Но я хочу использовать для этого встроенное окно инспектора (которое использует единство). - person Notbad; 18.04.2016
comment
Ваш менеджер узлов содержит только список классов узлов, но вместо того, чтобы просматривать детали этого сценария в том же окне, что и менеджер узлов, вы хотите, чтобы они были в отдельном окне? - person MrDiVolo; 18.04.2016

Есть возможность, вы можете создать для него собственный ScriptableObject и Custom Editor, а при открытии инспектора узлов просто найдите экземпляр объекта со сценарием и используйте Selection.selectedObject = scriptableObject, а в настраиваемом редакторе создайте статическое поле с именем «редактор» рисовать внутри. Это будет работать.

person Dark Reaper    schedule 28.05.2018