using UnityEngine; using UnityEditor; using Unheimlich.Data.Dialogues; [CustomEditor(typeof(DialogueConversation))] public class DialogueConversationEditor : Editor { private SerializedProperty _speakerNameProp; private SerializedProperty _displayModeProp; private SerializedProperty _dialogueNodesProp; [MenuItem("Unheimlich/Tools/Dialogue/Refresh All Conversations")] public static void RefreshAllConversations() { string[] guids = AssetDatabase.FindAssets("t:DialogueConversation"); int count = 0; foreach (string guid in guids) { string path = AssetDatabase.GUIDToAssetPath(guid); DialogueConversation conv = AssetDatabase.LoadAssetAtPath(path); if (conv != null) { EditorUtility.SetDirty(conv); count++; } } AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); Debug.Log($"[Dialogue Refresher] {count} conversations ont été rafraîchies !"); } private void OnEnable() { _speakerNameProp = serializedObject.FindProperty("SpeakerName"); _displayModeProp = serializedObject.FindProperty("DisplayMode"); _dialogueNodesProp = serializedObject.FindProperty("DialogueNodes"); } public override void OnInspectorGUI() { serializedObject.Update(); EditorGUILayout.Space(10); EditorGUILayout.LabelField("Conversation Setup", EditorStyles.boldLabel); EditorGUILayout.PropertyField(_speakerNameProp); EditorGUILayout.Space(5); EditorGUILayout.LabelField("Display Settings", EditorStyles.boldLabel); EditorGUILayout.PropertyField(_displayModeProp, new GUIContent("Display Mode")); EditorGUILayout.HelpBox( "World: Dialogue text appears in 3D space\n" + "Screen: Dialogue text appears on Canvas UI\n" + "Choices always appear in World space.", MessageType.Info); EditorGUILayout.Space(10); EditorGUILayout.LabelField("Dialogue Flow", EditorStyles.boldLabel); EditorGUILayout.HelpBox("The first DialogueNode in the list will be the starting point of the conversation.", MessageType.Info); EditorGUILayout.PropertyField(_dialogueNodesProp, new GUIContent("Dialogue Nodes"), true); EditorGUILayout.Space(10); if (GUILayout.Button("Create New Dialogue Node", GUILayout.Height(30))) CreateNewDialogueNode(); EditorGUILayout.Space(10); DialogueConversation conversation = (DialogueConversation)target; if (conversation.DialogueNodes != null && conversation.DialogueNodes.Count > 0) { EditorGUILayout.LabelField("Conversation Overview", EditorStyles.boldLabel); EditorGUILayout.LabelField($"Total Nodes: {conversation.DialogueNodes.Count}"); DialogueNode firstNode = conversation.GetFirstNode(); if (firstNode != null) EditorGUILayout.LabelField($"Starting Node: {firstNode.name}"); } serializedObject.ApplyModifiedProperties(); } private void CreateNewDialogueNode() { DialogueConversation conversation = (DialogueConversation)target; string path = AssetDatabase.GetAssetPath(conversation); string directory = System.IO.Path.GetDirectoryName(path); DialogueNode newNode = CreateInstance(); newNode.name = $"Node_{conversation.DialogueNodes.Count + 1}"; string nodePath = AssetDatabase.GenerateUniqueAssetPath($"{directory}/{newNode.name}.asset"); AssetDatabase.CreateAsset(newNode, nodePath); conversation.DialogueNodes.Add(newNode); EditorUtility.SetDirty(conversation); AssetDatabase.SaveAssets(); AssetDatabase.Refresh(); EditorGUIUtility.PingObject(newNode); } }