Files
Studio/Assets/Scripts/Studio/Managers/UserInputHandlerManager.cs
geondo55 e67b716dcf 백업
2025-05-21 18:45:17 +09:00

214 lines
6.9 KiB
C#

using Best.HTTP.JSON;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using UnityEngine;
using static UnityEngine.EventSystems.EventTrigger;
namespace XED.Manage
{
public class UserInputHandlerManager : Manager
{
List<InputHandler> inputHandlers = new List<InputHandler>();
public override void Init()
{
// SaveHandlerStack();
}
public void CreateInputHandler(InputHandler inputHandler)
{
for (int i = 0; i < inputHandlers.Count; i++)
{
if (inputHandlers[i].GetType() == inputHandler.GetType())
{
inputHandlers[i] = inputHandler;
return;
}
}
inputHandlers.Add(inputHandler);
}
public void SaveHandlerStack()
{
var data = new HandlerStackData();
foreach (var handler in inputHandlers)
{
var preset = new HandlerPreset()
{
id = handler.GetType().FullName,
updateLoopId = handler.updateLoop?.Method.Name,
};
foreach (var pair in handler.getKeyActions)
preset.getKeyActions.Add(new KeyActionEntry
{
key = pair.Key.ToString(),
actionId = pair.Value.Method.Name,
});
foreach (var pair in handler.downKeyActions)
preset.downKeyActions.Add(new KeyActionEntry
{
key = pair.Key.ToString(),
actionId = pair.Value.Method.Name,
});
foreach (var pair in handler.upKeyActions)
preset.upKeyActions.Add(new KeyActionEntry
{
key = pair.Key.ToString(),
actionId = pair.Value.Method.Name,
});
foreach (var key1 in handler.shortCutActions)
{
foreach (var key2 in key1.Value)
{
foreach (var key3 in key2.Value)
{
preset.shortcutActions.Add(new ShortcutEntry
{
key1 = key1.Key.ToString(),
key2 = key2.Key.ToString(),
key3 = key3.Key.ToString(),
actionId = key3.Value.Method.Name,
});
}
}
}
data.handlers.Add(preset);
}
json = JsonConvert.SerializeObject(data);
Debug.Log("data " + json);
}
public void LoadHandlerStack()
{
var data = JsonConvert.DeserializeObject<HandlerStackData>(json);
foreach (var preset in data.handlers)
{
Type handlerType = Type.GetType(preset.id);
if (handlerType == null)
{
continue;
}
Debug.Log("preset.id " + preset.id);
Debug.Log("handlerType " + handlerType.FullName);
var handler = inputHandlers.FirstOrDefault(h => h.GetType() == handlerType);
if (handler == null)
{
continue;
}
// Debug.Log("handler " + handler);
// owner 접근
var ownerField = handlerType.GetField("owner", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
var ownerString = ownerField?.GetValue(handler) as string;
if (string.IsNullOrEmpty(ownerString))
{
continue;
}
var ownerType = Type.GetType(ownerString);
if (ownerType == null)
{
continue;
}
var ownerMethods = ownerType.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic);
foreach (var entry in preset.getKeyActions)
{
// 함수 찾기
var method = ownerMethods.FirstOrDefault(m => m.Name == entry.actionId);
Debug.Log("method "+ method.Name);
Debug.Log("method " + method.Name);
Debug.Log("바보의 이름은")
//if (method != null)
//{
// var ownerInstanceObj = Activator.CreateInstance(ownerType);
// var action = (Action)Delegate.CreateDelegate(typeof(Action), ownerInstanceObj, method);
// var keyCode = ParseKeyCode(entry.key);
// Debug.Log("enter commit1");
// if (!handler.getKeyActions.ContainsKey(keyCode))
// {
// Debug.Log("enter commit2");
// handler.getKeyActions[keyCode] = action;
// }
//}
}
}
}
private KeyCode ParseKeyCode(string key)
{
if (Enum.TryParse<KeyCode>(key, out var result))
return result;
return KeyCode.None;
}
string json = @"{
""handlers"": [
{
""id"": ""CommandInvokerInputHandler"",
""updateLoopId"": null,
""getKeyActions"": [],
""downKeyActions"": [],
""upKeyActions"": [],
""shortcutActions"": [
{
""key1"": ""LeftShift"",
""key2"": ""None"",
""key3"": ""Z"",
""actionId"": ""Undo""
},
{
""key1"": ""LeftShift"",
""key2"": ""None"",
""key3"": ""X"",
""actionId"": ""Redo""
}
]
},
{
""id"": ""RenderObjectHandlerInputHandler"",
""updateLoopId"": null,
""getKeyActions"": [
{ ""key"": ""E"", ""actionId"": ""<GetInputHandler>b__36_0"" },
{ ""key"": ""W"", ""actionId"": ""<GetInputHandler>b__36_1"" },
{ ""key"": ""Q"", ""actionId"": ""<GetInputHandler>b__36_2"" },
{ ""key"": ""R"", ""actionId"": ""<GetInputHandler>b__36_3"" },
{ ""key"": ""V"", ""actionId"": ""VertexSnap"" }
],
""downKeyActions"": [
{ ""key"": ""Mouse0"", ""actionId"": ""OnMousePointerDown"" }
],
""upKeyActions"": [
{ ""key"": ""Mouse0"", ""actionId"": ""OnMousePointerUp"" }
],
""shortcutActions"": [
{ ""key1"": ""LeftShift"", ""key2"": ""None"", ""key3"": ""C"", ""actionId"": ""SaveItemsToCopy"" },
{ ""key1"": ""LeftShift"", ""key2"": ""None"", ""key3"": ""V"", ""actionId"": ""<GetInputHandler>b__36_4"" }
]
}
]
}";
}
}