public override void OnInspectorGUI() { base.OnInspectorGUI(); Reset(); EditorGUILayout.LabelField("Conversations", EditorStyles.boldLabel); RandomDialog dialog = target as RandomDialog; for (int i = 0; i < dialog.conversations.Count; i++) { AddSentenceEditor(i); if (expandSentences[i]) { EditorGUILayout.Space(); } } if (GUILayout.Button("Add Conversation")) { Conversation newConvo = new Conversation(); newConvo.sentences.Add(new Sentence()); dialog.conversations.Add(newConvo); expandSentences.Add(true); convoLabels.Add("New Conversation"); } }
public void Reset() { RandomDialog dialog = target as RandomDialog; // -- These fields don't serialize properly, so they get overwritten on play mode // Initialize them manually if (expandSentences == null) { expandSentences = new List <bool>(); foreach (Conversation c in dialog.conversations) { expandSentences.Add(false); } } if (convoLabels == null) { convoLabels = new List <string>(); for (int i = 0; i < dialog.conversations.Count; i++) { // -- Populate the conversation TL;DR if possible if (dialog.conversations[i].sentences[0] != null && dialog.conversations[i].sentences[0].text != "") { convoLabels.Add(dialog.conversations[i].sentences[0].text); } else { convoLabels.Add("Conversation " + i); } } } }
private void AddSentenceEditor(int i) { RandomDialog dialog = target as RandomDialog; Sentence sentenceToDelete; expandSentences[i] = EditorGUILayout.Foldout(expandSentences[i], convoLabels[i]); EditorGUI.indentLevel += 1; if (expandSentences[i]) { sentenceToDelete = null; // -- Editor-only field EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Convo topic:", GUILayout.MaxWidth(100)); convoLabels[i] = EditorGUILayout.TextField(convoLabels[i]); EditorGUILayout.EndHorizontal(); foreach (Sentence s in dialog.conversations[i].sentences) { EditorGUI.BeginChangeCheck(); if (s == null) { break; } // -- Horizontal section EditorGUILayout.BeginHorizontal(); EditorGUILayout.LabelField("Speaker:", GUILayout.MaxWidth(70)); s.currentSpeaker = (DialogSpeaker)EditorGUILayout.EnumPopup(s.currentSpeaker); EditorGUILayout.LabelField("Animation:", GUILayout.MaxWidth(70)); s.animationState = (AnimationState)EditorGUILayout.EnumPopup(s.animationState); if (GUILayout.Button("-")) { // Can't remove an element in the middle of a foreach loop sentenceToDelete = s; Undo.RecordObject(target, "Deleted Sentence"); EditorUtility.SetDirty(dialog); } EditorGUILayout.EndHorizontal(); // -- Text field s.text = EditorGUILayout.TextField(s.text); if (EditorGUI.EndChangeCheck()) { Undo.RecordObject(dialog, "sentence change"); EditorUtility.SetDirty(dialog); } } if (sentenceToDelete != null) { dialog.conversations[i].sentences.Remove(sentenceToDelete); } // -- Add sentence / remove convo EditorGUILayout.BeginHorizontal(); if (GUILayout.Button("Add Sentence")) { dialog.conversations[i].sentences.Add(new Sentence()); Undo.RecordObject(target, "Added Sentence"); EditorUtility.SetDirty(dialog); } if (GUILayout.Button("Delete conversation")) { dialog.conversations.RemoveAt(i); expandSentences.RemoveAt(i); convoLabels.RemoveAt(i); Undo.RecordObject(target, "Deleted Conversation"); EditorUtility.SetDirty(dialog); } EditorGUILayout.EndHorizontal(); } EditorGUI.indentLevel -= 1; }