169 lines
4.8 KiB
C#
169 lines
4.8 KiB
C#
|
|
using System;
|
||
|
|
using System.Collections;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using TMPro;
|
||
|
|
using UnityEngine;
|
||
|
|
using UnityEngine.EventSystems;
|
||
|
|
using WI;
|
||
|
|
|
||
|
|
namespace CHN
|
||
|
|
{
|
||
|
|
public class UserInputManager : MonoBehaviour, ISingle
|
||
|
|
{
|
||
|
|
Dictionary<KeyCode, Action> getKeyActionTable = new Dictionary<KeyCode, Action>();
|
||
|
|
Dictionary<KeyCode, Action> upKeyActionTable = new Dictionary<KeyCode, Action>();
|
||
|
|
Dictionary<KeyCode, Action> downKeyActionTable = new Dictionary<KeyCode, Action>();
|
||
|
|
Dictionary<KeyCode, Dictionary<KeyCode, Action>> shortCutActionTable = new ();
|
||
|
|
Stack<InputHandler> handlerStack = new();
|
||
|
|
Action updateLoop;
|
||
|
|
|
||
|
|
public void SetHandler(InputHandler handler)
|
||
|
|
{
|
||
|
|
SetKeyboardPreset(handler);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void RemoveHandler(InputHandler handler)
|
||
|
|
{
|
||
|
|
Stack<InputHandler> tempStack = new();
|
||
|
|
|
||
|
|
while (handlerStack.Count > 0)
|
||
|
|
{
|
||
|
|
var currentHandler = handlerStack.Pop();
|
||
|
|
if (currentHandler == handler)
|
||
|
|
{
|
||
|
|
RemoveKeyActionPreset(currentHandler);
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
tempStack.Push(currentHandler);
|
||
|
|
}
|
||
|
|
|
||
|
|
while(tempStack.Count > 0)
|
||
|
|
{
|
||
|
|
var tempHandler = tempStack.Pop();
|
||
|
|
SetKeyboardPreset(tempHandler);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
void RemoveKeyActionPreset(InputHandler handler)
|
||
|
|
{
|
||
|
|
foreach(var k in handler.getKeyActions)
|
||
|
|
{
|
||
|
|
getKeyActionTable.Remove(k.Key);
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach(var k in handler.upKeyActions)
|
||
|
|
{
|
||
|
|
upKeyActionTable.Remove(k.Key);
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach(var k in handler.downKeyActions)
|
||
|
|
{
|
||
|
|
downKeyActionTable.Remove(k.Key);
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach(var k in handler.shortCutActions)
|
||
|
|
{
|
||
|
|
foreach(var kk in k.Value)
|
||
|
|
{
|
||
|
|
shortCutActionTable[k.Key].Remove(kk.Key);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
updateLoop -= handler.updateLoop;
|
||
|
|
}
|
||
|
|
void SetKeyboardPreset(InputHandler handler)
|
||
|
|
{
|
||
|
|
handlerStack.Push(handler);
|
||
|
|
foreach (var k in handler.getKeyActions)
|
||
|
|
{
|
||
|
|
getKeyActionTable[k.Key] = k.Value;
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach(var k in handler.upKeyActions)
|
||
|
|
{
|
||
|
|
upKeyActionTable[k.Key]= k.Value;
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach(var k in handler.downKeyActions)
|
||
|
|
{
|
||
|
|
downKeyActionTable[k.Key]= k.Value;
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (var k in handler.shortCutActions)
|
||
|
|
{
|
||
|
|
if (!shortCutActionTable.ContainsKey(k.Key))
|
||
|
|
{
|
||
|
|
shortCutActionTable.Add(k.Key, new Dictionary<KeyCode, Action>());
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (var kk in k.Value)
|
||
|
|
{
|
||
|
|
if (shortCutActionTable[k.Key].ContainsKey(kk.Key))
|
||
|
|
shortCutActionTable[k.Key].Remove(kk.Key);
|
||
|
|
|
||
|
|
shortCutActionTable[k.Key].Add(kk.Key, kk.Value);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
updateLoop += handler.updateLoop;
|
||
|
|
}
|
||
|
|
void Update()
|
||
|
|
{
|
||
|
|
if (IsEditInputField())
|
||
|
|
return;
|
||
|
|
|
||
|
|
foreach (var key in downKeyActionTable.Keys)
|
||
|
|
{
|
||
|
|
if (Input.GetKeyDown(key))
|
||
|
|
{
|
||
|
|
downKeyActionTable[key]?.Invoke();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (var key in getKeyActionTable.Keys)
|
||
|
|
{
|
||
|
|
if (Input.GetKey(key))
|
||
|
|
{
|
||
|
|
getKeyActionTable[key]?.Invoke();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (var key in upKeyActionTable.Keys)
|
||
|
|
{
|
||
|
|
if (Input.GetKeyUp(key))
|
||
|
|
{
|
||
|
|
upKeyActionTable[key]?.Invoke();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
foreach (var key in shortCutActionTable.Keys)
|
||
|
|
{
|
||
|
|
if (Input.GetKey(key))
|
||
|
|
{
|
||
|
|
if (shortCutActionTable.TryGetValue(key, out var kk))
|
||
|
|
{
|
||
|
|
foreach (var k in kk)
|
||
|
|
{
|
||
|
|
if (Input.GetKeyDown(k.Key))
|
||
|
|
{
|
||
|
|
k.Value?.Invoke();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
updateLoop?.Invoke();
|
||
|
|
}
|
||
|
|
|
||
|
|
bool IsEditInputField()
|
||
|
|
{
|
||
|
|
GameObject selectedObj = EventSystem.current.currentSelectedGameObject;
|
||
|
|
|
||
|
|
if (selectedObj == null)
|
||
|
|
return false;
|
||
|
|
|
||
|
|
return selectedObj.GetComponent<TMP_InputField>() != null;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|