117 lines
4.3 KiB
C#
117 lines
4.3 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
using System.Collections.Generic;
|
|
using Unheimlich.Data.Dialogues;
|
|
|
|
[CustomEditor(typeof(DialogueConversation))]
|
|
public class DialogueConversationEditor : Editor
|
|
{
|
|
private SerializedProperty _speakerNameProp;
|
|
private SerializedProperty _speakerNameLocalizationKeyProp;
|
|
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<DialogueConversation>(path);
|
|
|
|
if (conv != null)
|
|
{
|
|
EditorUtility.SetDirty(conv);
|
|
count++;
|
|
}
|
|
}
|
|
|
|
AssetDatabase.SaveAssets();
|
|
AssetDatabase.Refresh();
|
|
|
|
Debug.Log($"<color=green>[Dialogue Refresher]</color> {count} conversations ont été rafraîchies !");
|
|
}
|
|
|
|
private void OnEnable()
|
|
{
|
|
_speakerNameProp = serializedObject.FindProperty("SpeakerName");
|
|
_speakerNameLocalizationKeyProp = serializedObject.FindProperty("SpeakerNameLocalizationKey");
|
|
_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.PropertyField(_speakerNameLocalizationKeyProp, new GUIContent("Localization Key (Optional)"));
|
|
|
|
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 = ScriptableObject.CreateInstance<DialogueNode>();
|
|
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);
|
|
}
|
|
}
|