diff --git a/Config/MovementDefinitionFactory.cs b/Config/MovementDefinitionFactory.cs index b8ac278..49d0f7f 100644 --- a/Config/MovementDefinitionFactory.cs +++ b/Config/MovementDefinitionFactory.cs @@ -135,14 +135,5 @@ namespace Syntriax.Modules.Movement.Config foreach (string monoBehaviours in definition.MonoBehaviours) MovementFactory.Instance.AddToGameObject(gameObject, monoBehaviours); } - -#if UNITY_EDITOR - public static void SaveMovementDefinition(MovementDefinition definition) - { - string jsonText = JsonUtility.ToJson(definition, true); - string path = $"Assets/Resources/{ResourceDirectoryToDefinitions}{definition.Name}.json"; - System.IO.File.WriteAllText(path, jsonText); - } -#endif } } diff --git a/Config/MovementFactory.cs b/Config/MovementFactory.cs index a367294..7a63d75 100644 --- a/Config/MovementFactory.cs +++ b/Config/MovementFactory.cs @@ -67,17 +67,17 @@ namespace Syntriax.Modules.Movement.Config public Component AddToGameObject(GameObject gameObject, string name) { if (!Types.ContainsKey(name)) - throw new ArgumentException($"The key \"{ name }\" does not exists in the current { Name }"); + throw new ArgumentException($"The key \"{name}\" does not exists in the current {Name}"); return gameObject.AddComponent(Types[name]); } - public string GetTypeName(Type type) + public static string GetTypeName(Type type) { if (string.IsNullOrEmpty(type.Namespace)) return type.Name; - return $"{ type.Namespace }.{ type.Name }"; + return $"{type.Namespace}.{type.Name}"; } } } diff --git a/Editor/CreateMovementDefinitionEditor.cs b/Editor/CreateMovementDefinitionEditor.cs deleted file mode 100644 index 6d37c8c..0000000 --- a/Editor/CreateMovementDefinitionEditor.cs +++ /dev/null @@ -1,51 +0,0 @@ -using UnityEngine; -using UnityEditor; -using UnityEditorInternal; - -namespace Syntriax.Modules.Movement.Editor -{ - public class CreateMovementDefinitionEditor : EditorWindow - { - ReorderableList list; - - [MenuItem("Syntriax/Modules/Create Movement Definition")] - private static void ShowWindow() - { - var window = GetWindow(); - window.titleContent = new GUIContent("Create Movement Definition"); - window.Show(); - } - - private void OnGUI() - { - GUILayout.Label("Definition Name"); - string definitionName = GUILayout.TextField("Movement Definition"); - - GUILayout.Space(10); - bool createButtonPressed = GUILayout.Button("Create"); - - if (!createButtonPressed) - return; - - string resourceDirectoryToDefinitions = Movement.Config.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"; - Movement.Config.MovementDefinitionFactory.SaveMovementDefinition(new Config.MovementDefinition(definitionName, new Config.MovementConfig[0], new string[0])); - } - - private static void CreateSubFolder(string parentFolder, string subFolder) - { - if (!AssetDatabase.IsValidFolder($"{parentFolder}/{subFolder}")) - AssetDatabase.CreateFolder(parentFolder, subFolder); - } - } -} diff --git a/Editor/DefinitionCreatorEditor.cs b/Editor/DefinitionCreatorEditor.cs new file mode 100644 index 0000000..8fbff7a --- /dev/null +++ b/Editor/DefinitionCreatorEditor.cs @@ -0,0 +1,102 @@ +using UnityEngine; +using UnityEditor; +using UnityEditorInternal; +using Syntriax.Modules.Movement.Config; + +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() + { + movementDefinition.Name = "Example Movement Definition"; + movementDefinition.MovementConfigs = new MovementConfig[] { new MovementConfig(MovementFactory.GetTypeName(typeof(Implementations.GroundMovement1D)), 5f) }; + movementDefinition.MonoBehaviours = new string[] { MovementFactory.GetTypeName(typeof(MovementController)) }; + + serializedObject = new SerializedObject(this); + } + + private void OnEnable() => serializedObject = new SerializedObject(this); + + private void OnGUI() + { + 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\""); + + if (!createButtonPressed) + return; + + if (string.IsNullOrWhiteSpace(movementName.stringValue)) + { + 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 += $"/{movementName.stringValue}.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(); + } + } +} diff --git a/Editor/CreateMovementDefinitionEditor.cs.meta b/Editor/DefinitionCreatorEditor.cs.meta similarity index 83% rename from Editor/CreateMovementDefinitionEditor.cs.meta rename to Editor/DefinitionCreatorEditor.cs.meta index 2546f37..dac0474 100644 --- a/Editor/CreateMovementDefinitionEditor.cs.meta +++ b/Editor/DefinitionCreatorEditor.cs.meta @@ -1,5 +1,5 @@ fileFormatVersion: 2 -guid: 4e6c6eea597fd2d4e96946897f9a0bd6 +guid: 66c563464d207f24999eef31c43f1fc8 MonoImporter: externalObjects: {} serializedVersion: 2