214 lines
6.9 KiB
C#
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"" }
|
|
]
|
|
}
|
|
]
|
|
}";
|
|
|
|
}
|
|
}
|