Как я могу получить SerializedObject и FineProperty также дерево узлов потомков разговоров? - PullRequest
2 голосов
/ 14 мая 2019
using System.Collections;
using System.Collections.Generic;
using UnityEditor;
using UnityEditorInternal;
using UnityEngine;

public class ConversationsEditorWindow : EditorWindow
{
    const int TOP_PADDING = 2;
    const string HELP_TEXT = "Can not find 'Conversation' component on any GameObject in the Scene.";

    static Vector2 s_WindowsMinSize = Vector2.one * 300.0f;
    static Rect s_HelpRect = new Rect(0.0f, 0.0f, 300.0f, 100.0f);
    static Rect s_ListRect = new Rect(Vector2.zero, s_WindowsMinSize);

    [MenuItem("Conversations/Editor")]
    private static void ConversationsSystem()
    {
        const int width = 800;
        const int height = 800;

        var x = (Screen.currentResolution.width - width) / 2;
        var y = (Screen.currentResolution.height - height) / 2;

        GetWindow<ConversationsEditorWindow>().position = new Rect(x, y, width, height);
    }

    SerializedObject m_Conversations = null;
    ReorderableList m_ReorderableList = null;

    private void OnEnable()
    {
        ConversationTrigger conversationtrigger = FindObjectOfType<ConversationTrigger>();
        if (conversationtrigger)
        {
            m_Conversations = new SerializedObject(conversationtrigger);
            m_ReorderableList = new ReorderableList(m_Conversations, m_Conversations.FindProperty("conversations"), true, true, true, true);

            m_ReorderableList.drawHeaderCallback = (rect) => EditorGUI.LabelField(rect, "Conversation Names");
            m_ReorderableList.drawElementCallback = (Rect rect, int index, bool isActive, bool isFocused) =>
            {
                rect.y += TOP_PADDING;
                rect.height = EditorGUIUtility.singleLineHeight;
                EditorGUI.PropertyField(rect, m_ReorderableList.serializedProperty.GetArrayElementAtIndex(index));
            };
        }
    }

    private void OnInspectorUpdate()
    {
        Repaint();
    }

    private void OnGUI()
    {
        if (m_Conversations != null)
        {
            m_Conversations.Update();
            m_ReorderableList.DoList(s_ListRect);
            m_Conversations.ApplyModifiedProperties();
        }
        else
        {
            EditorGUI.HelpBox(s_HelpRect, HELP_TEXT, MessageType.Warning);
        }
    }
}

Вот так выглядит инспектор в окне редактора:

Conversations

Первая проблема заключается в том, что я могу добавлять / удалять элементыв окне редактора любого GameObject в Иерархии.Но я хочу иметь возможность делать это только на GameObject, в котором идет разговор.В этом случае это должен быть DialogueTrigger, но я могу добавлять / удалять элементы, даже если я, например, выбираю Terrain.

Вторая проблема заключается в том, что в окне редактора не отображаются дочерние элементы дерева узлов каждого из них.диалог.Например, открытие имеет «Имя» и «Диалоги» и т. Д., Но оно не отображается, когда я щелкаю стрелку сворачивания в окне редактора.

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

(теперь добавляется только последний разговор каждый раз при нажатии на плюс (+) в окне редактора. Он все время добавляет Замкнутую комнату, даже если я выбираю сначала открытие.

Первая решенная проблема:

private void OnGUI()
    {
        var go = Selection.gameObjects[0];
        var ct = go.GetComponent<ConversationTrigger>();

        if (ct != null)
        {
            m_Conversations.Update();
            m_ReorderableList.DoList(s_ListRect);
            m_Conversations.ApplyModifiedProperties();
        }
        else
        {
            EditorGUI.HelpBox(s_HelpRect, HELP_TEXT, MessageType.Warning);
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...