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);
}
}
}
Вот так выглядит инспектор в окне редактора:

Первая проблема заключается в том, что я могу добавлять / удалять элементыв окне редактора любого 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);
}
}