using UnityEngine; using UnityEditor; using UnityEditorInternal; using Syntriax.Modules.Movement.Config; using System; namespace Syntriax.Modules.Movement.Editor { public class DefinitionCreatorEditor : EditorWindow { ReorderableList list; public MovementDefinition movementDefinition = new MovementDefinition(); private SerializedObject serializedObject; [MenuItem("Syntriax/Modules/Movement/Definition Creator")] private static void ShowWindow() { var window = GetWindow(); window.titleContent = new GUIContent("Definition Creator"); window.Reset(); window.Show(); } private void Reset() => LoadPresetQuick(); private void OnEnable() => UpdateSerializedObject(); private void OnGUI() { GUILayout.Space(10); GUILayout.BeginHorizontal(); bool quickPresetButtonPressed = GUILayout.Button("Quick Preset"); GUILayout.Space(10); bool longerPresetButtonPressed = GUILayout.Button("Longer Preset"); GUILayout.EndHorizontal(); GUILayout.Space(10); SerializedProperty movementDefinitionProperty = serializedObject.FindProperty("movementDefinition"); SerializedProperty movementName = movementDefinitionProperty.FindPropertyRelative("Name"); SerializedProperty movementMovementConfigs = movementDefinitionProperty.FindPropertyRelative("MovementConfigs"); SerializedProperty movementMonoBehaviours = movementDefinitionProperty.FindPropertyRelative("MonoBehaviours"); // EditorGUILayout.PropertyField(movementDefinitionProperty, new GUIContent("New Movement Definition"), true); EditorGUILayout.PropertyField(movementName); EditorGUILayout.PropertyField(movementMovementConfigs, true); EditorGUILayout.PropertyField(movementMonoBehaviours); serializedObject.ApplyModifiedProperties(); GUILayout.Space(10); bool createButtonPressed = GUILayout.Button("Create"); GUILayout.Label($"Will be saved to Assets/Resources/{MovementDefinitionFactory.ResourceDirectoryToDefinitions}{movementName.stringValue}.json"); GUILayout.Space(10); GUILayout.Label("Tip: MovementConfigs->TypeName and MonoBehaviours have the same naming system"); GUILayout.Label("If under a namespace: \"Namespace.ClassName\""); GUILayout.Label("If not under a namespace: \"ClassName\""); GUILayout.Space(5); GUILayout.Label($"Tip: Apply these to your GameObjects by using {nameof(MovementDefinitionFactory)}"); GUILayout.Label($"{nameof(MovementDefinitionFactory)}.Instance.ApplyDefinitionToGameObject(\"{movementName.stringValue}\");"); if (quickPresetButtonPressed) LoadPresetQuick(); if (longerPresetButtonPressed) LoadPresetLonger(); if (createButtonPressed) CreateDefinition(movementName.stringValue); } private void LoadPresetQuick() { movementDefinition.Name = "Example Movement Definition (Quick)"; movementDefinition.MovementConfigs = new MovementConfig[] { new MovementConfig(MovementFactory.GetTypeName(typeof(Implementations.GroundMovement1D)), 5f) }; movementDefinition.MonoBehaviours = new string[] { MovementFactory.GetTypeName(typeof(MovementController)) }; UpdateSerializedObject(); } private void LoadPresetLonger() { movementDefinition.Name = "Example Movement Definition (Longer)"; movementDefinition.MovementConfigs = new MovementConfig[] { new MovementConfig(MovementFactory.GetTypeName(typeof(Implementations.AirMovement1D)), 5f), new MovementConfig(MovementFactory.GetTypeName(typeof(Implementations.GroundMovement1D)), 5f) }; movementDefinition.MonoBehaviours = new string[] { MovementFactory.GetTypeName(typeof(MovementController)), MovementFactory.GetTypeName(typeof(ToggleState.ToggleStateMonoBehaviour)) }; UpdateSerializedObject(); } private void UpdateSerializedObject() => serializedObject = new SerializedObject(this); private void CreateDefinition(string definitionName) { if (string.IsNullOrWhiteSpace(definitionName)) { EditorUtility.DisplayDialog("Empty Name Field", "Name field must be not empty", "OK"); return; } string resourceDirectoryToDefinitions = MovementDefinitionFactory.ResourceDirectoryToDefinitions; string[] folders = resourceDirectoryToDefinitions.Split('/'); string currentPath = "Assets/Resources"; CreateSubFolder("Assets", "Resources"); foreach (string folder in folders) { CreateSubFolder(currentPath, folder); currentPath += $"/{folder}"; } currentPath += $"/{definitionName}.json"; SaveMovementDefinition(movementDefinition); } private void CreateSubFolder(string parentFolder, string subFolder) { if (!AssetDatabase.IsValidFolder($"{parentFolder}/{subFolder}")) AssetDatabase.CreateFolder(parentFolder, subFolder); } public void SaveMovementDefinition(MovementDefinition definition) { string jsonText = JsonUtility.ToJson(definition, true); string path = $"Assets/Resources/{MovementDefinitionFactory.ResourceDirectoryToDefinitions}{definition.Name}.json"; if (!EditorUtility.DisplayDialog("Conflict", $"\"{path}\" already exists, do you want to overwrite?", "Overwrite", "Cancel")) return; System.IO.File.WriteAllText(path, jsonText); AssetDatabase.Refresh(); } } }