AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Script/UI/CommandDispatcher/CommandDispatcher.cs

130 lines
4.4 KiB
C#
Raw Normal View History

2024-09-12 15:10:48 +08:00
using System.Collections.Generic;
using UnityEngine;
namespace AxibugEmuOnline.Client
{
public class CommandDispatcher : MonoBehaviour
{
public static CommandDispatcher Instance { get; private set; }
/// <summary> ƽ<><C6BD>ע<EFBFBD><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD>,<2C><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ӧָ<D3A6><D6B8> </summary>
2024-09-12 15:10:48 +08:00
List<CommandExecuter> m_register = new List<CommandExecuter>();
/// <summary> <20><>ռע<D5BC><D7A2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><><D6B8><EFBFBD><EFBFBD>б<EFBFBD><D0B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ </summary>
List<CommandExecuter> m_registerHigh = new List<CommandExecuter>();
2024-09-12 15:10:48 +08:00
Dictionary<KeyCode, EnumCommand> m_keyMapper = new Dictionary<KeyCode, EnumCommand>();
private void Awake()
{
Instance = this;
m_keyMapper.Add(KeyCode.A, EnumCommand.SelectItemLeft);
m_keyMapper.Add(KeyCode.D, EnumCommand.SelectItemRight);
m_keyMapper.Add(KeyCode.W, EnumCommand.SelectItemUp);
m_keyMapper.Add(KeyCode.S, EnumCommand.SelectItemDown);
m_keyMapper.Add(KeyCode.K, EnumCommand.Enter);
m_keyMapper.Add(KeyCode.L, EnumCommand.Back);
m_keyMapper.Add(KeyCode.I, EnumCommand.OptionMenu);
m_keyMapper.Add(KeyCode.LeftArrow, EnumCommand.SelectItemLeft);
m_keyMapper.Add(KeyCode.RightArrow, EnumCommand.SelectItemRight);
m_keyMapper.Add(KeyCode.UpArrow, EnumCommand.SelectItemUp);
m_keyMapper.Add(KeyCode.DownArrow, EnumCommand.SelectItemDown);
m_keyMapper.Add(KeyCode.Return, EnumCommand.Enter);
m_keyMapper.Add(KeyCode.Escape, EnumCommand.Back);
m_keyMapper.Add(KeyCode.RightShift, EnumCommand.OptionMenu);
m_keyMapper.Add(KeyCode.LeftShift, EnumCommand.OptionMenu);
}
private void OnDestroy()
{
Instance = null;
}
public void RegistController(CommandExecuter controller)
{
if (!controller.AloneMode)
{
if (m_register.Contains(controller)) { return; }
2024-09-12 15:10:48 +08:00
m_register.Add(controller);
}
else
{
if (m_registerHigh.Contains(controller)) { return; }
m_registerHigh.Add(controller);
}
2024-09-12 15:10:48 +08:00
}
public void UnRegistController(CommandExecuter menuItemController)
{
if (!menuItemController.AloneMode)
m_register.Remove(menuItemController);
else
m_registerHigh.Remove(menuItemController);
2024-09-12 15:10:48 +08:00
}
readonly List<CommandExecuter> oneFrameRegister = new List<CommandExecuter>();
private void Update()
{
foreach (var item in m_keyMapper)
{
peekRegister(oneFrameRegister);
2024-09-12 15:10:48 +08:00
if (Input.GetKeyDown(item.Key))
{
foreach (var controller in oneFrameRegister)
2024-09-12 15:10:48 +08:00
{
if (!controller.Enable) continue;
controller.ExecuteCommand(item.Value, false);
}
}
if (Input.GetKeyUp(item.Key))
{
foreach (var controller in oneFrameRegister)
2024-09-12 15:10:48 +08:00
{
if (!controller.Enable) continue;
controller.ExecuteCommand(item.Value, true);
}
}
}
}
private List<CommandExecuter> peekRegister(List<CommandExecuter> results)
{
results.Clear();
if (m_registerHigh.Count > 0)
{
for (int i = m_registerHigh.Count - 1; i >= 0; i--)
{
var controller = m_registerHigh[i];
if (controller.Enable)
{
results.Add(controller);
return results;
}
}
}
foreach (var controller in m_register)
{
if (!controller.Enable) continue;
results.Add(controller);
}
return results;
}
#if UNITY_EDITOR
public void GetRegisters(out IReadOnlyList<CommandExecuter> normal, out IReadOnlyList<CommandExecuter> alone)
{
normal = m_register;
alone = m_registerHigh;
}
#endif
2024-09-12 15:10:48 +08:00
}
}