153 lines
6.1 KiB
C#
153 lines
6.1 KiB
C#
using UnityEngine;
|
|
using UnityEditor;
|
|
using UnityEditorInternal;
|
|
using Syntriax.Modules.Movement.Config;
|
|
using System;
|
|
using Syntriax.Modules.Factory;
|
|
|
|
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();
|
|
}
|
|
|
|
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 use the type.FullName value");
|
|
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)} or the {nameof(MovementDefinitionApplier)} component");
|
|
GUILayout.Label($"{nameof(FactorySingleton<MovementDefinitionFactory>)}<{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(typeof(Implementations.GroundMovement1D).FullName, 5f)
|
|
};
|
|
|
|
movementDefinition.MonoBehaviours = new string[]
|
|
{
|
|
typeof(MovementController).FullName
|
|
};
|
|
|
|
UpdateSerializedObject();
|
|
}
|
|
|
|
private void LoadPresetLonger()
|
|
{
|
|
movementDefinition.Name = "Example Movement Definition (Longer)";
|
|
|
|
movementDefinition.MovementConfigs = new MovementConfig[]
|
|
{
|
|
new MovementConfig(typeof(Implementations.AirMovement1D).FullName, 5f),
|
|
new MovementConfig(typeof(Implementations.GroundMovement1D).FullName, 5f)
|
|
};
|
|
|
|
movementDefinition.MonoBehaviours = new string[]
|
|
{
|
|
typeof(MovementController).FullName,
|
|
typeof(ToggleState.ToggleStateMonoBehaviour).FullName
|
|
};
|
|
|
|
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();
|
|
}
|
|
}
|
|
}
|