Movement/Editor/DefinitionCreatorEditor.cs

152 lines
6.0 KiB
C#
Raw Normal View History

2022-11-16 20:58:14 +03:00
using UnityEngine;
using UnityEditor;
using UnityEditorInternal;
using Syntriax.Modules.Movement.Config;
2022-11-16 21:28:55 +03:00
using System;
2022-11-16 20:58:14 +03:00
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<DefinitionCreatorEditor>();
window.titleContent = new GUIContent("Definition Creator");
window.Reset();
window.Show();
}
2022-11-16 21:28:55 +03:00
private void Reset() => LoadPresetQuick();
2022-11-16 20:58:14 +03:00
2022-11-16 21:28:55 +03:00
private void OnEnable() => UpdateSerializedObject();
2022-11-16 20:58:14 +03:00
private void OnGUI()
{
GUILayout.Space(10);
2022-11-16 21:28:55 +03:00
GUILayout.BeginHorizontal();
bool quickPresetButtonPressed = GUILayout.Button("Quick Preset");
GUILayout.Space(10);
bool longerPresetButtonPressed = GUILayout.Button("Longer Preset");
GUILayout.EndHorizontal();
GUILayout.Space(10);
2022-11-16 20:58:14 +03:00
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\"");
2022-11-16 21:28:55 +03:00
GUILayout.Space(5);
2022-11-16 21:32:59 +03:00
GUILayout.Label($"Tip: Apply these to your GameObjects by using {nameof(MovementDefinitionFactory)}");
GUILayout.Label($"{nameof(MovementDefinitionFactory)}.Instance.ApplyDefinitionToGameObject(\"{movementName.stringValue}\");");
2022-11-16 20:58:14 +03:00
2022-11-16 21:28:55 +03:00
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)
};
2022-11-16 20:58:14 +03:00
2022-11-16 21:28:55 +03:00
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))
2022-11-16 20:58:14 +03:00
{
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}";
}
2022-11-16 21:28:55 +03:00
currentPath += $"/{definitionName}.json";
2022-11-16 20:58:14 +03:00
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();
}
}
}