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

198 lines
7.2 KiB
C#
Raw Normal View History

2024-09-12 15:08:48 +08:00
using AxibugEmuOnline.Client.UI;
using System;
2024-08-16 17:26:28 +08:00
using System.Collections.Generic;
using UnityEngine;
namespace AxibugEmuOnline.Client
{
public class CommandDispatcher : MonoBehaviour
{
public static CommandDispatcher Instance { get; private set; }
2024-09-12 15:08:48 +08:00
List<CommandExecuter> m_register = new List<CommandExecuter>();
Dictionary<KeyCode, EnumCommand> m_keyMapper = new Dictionary<KeyCode, EnumCommand>();
2024-08-16 17:26:28 +08:00
private void Awake()
{
Instance = this;
2024-09-12 15:08:48 +08:00
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);
2024-08-16 17:26:28 +08:00
}
private void OnDestroy()
{
Instance = null;
}
2024-09-12 15:08:48 +08:00
public void RegistController(CommandExecuter controller)
2024-08-16 17:26:28 +08:00
{
2024-08-21 16:28:23 +08:00
if (m_register.Contains(controller)) { return; }
2024-08-16 17:26:28 +08:00
m_register.Add(controller);
}
2024-09-12 15:08:48 +08:00
public void UnRegistController(CommandExecuter menuItemController)
2024-08-16 17:26:28 +08:00
{
m_register.Remove(menuItemController);
}
2024-09-12 15:08:48 +08:00
readonly List<CommandExecuter> oneFrameRegister = new List<CommandExecuter>();
2024-08-16 17:26:28 +08:00
private void Update()
{
foreach (var item in m_keyMapper)
{
if (Input.GetKeyDown(item.Key))
{
2024-09-11 16:33:48 +08:00
oneFrameRegister.Clear();
oneFrameRegister.AddRange(m_register);
for (int i = 0; i < oneFrameRegister.Count; i++)
2024-08-21 16:28:23 +08:00
{
2024-09-11 16:33:48 +08:00
var controller = oneFrameRegister[i];
2024-09-12 15:08:48 +08:00
if (!controller.Enable) continue;
2024-08-16 17:26:28 +08:00
controller.ExecuteCommand(item.Value, false);
2024-08-21 16:28:23 +08:00
}
2024-08-16 17:26:28 +08:00
}
if (Input.GetKeyUp(item.Key))
{
2024-09-11 16:33:48 +08:00
oneFrameRegister.Clear();
oneFrameRegister.AddRange(m_register);
for (int i = 0; i < oneFrameRegister.Count; i++)
2024-08-21 16:28:23 +08:00
{
2024-09-11 16:33:48 +08:00
var controller = oneFrameRegister[i];
2024-09-12 15:08:48 +08:00
if (!controller.Enable) continue;
2024-08-16 17:26:28 +08:00
controller.ExecuteCommand(item.Value, true);
2024-08-21 16:28:23 +08:00
}
2024-08-16 17:26:28 +08:00
}
}
}
}
2024-09-12 15:08:48 +08:00
public abstract class CommandExecuter : MonoBehaviour
{
private PulseInvoker m_pulsInvoker_Left;
private PulseInvoker m_pulsInvoker_Right;
private PulseInvoker m_pulsInvoker_Up;
private PulseInvoker m_pulsInvoker_Down;
[SerializeField]
float PulseInvoke_Delay = 0.4f;
[SerializeField]
float PulseInvoke_Interval = 0.05f;
public abstract bool Enable { get; }
protected virtual void Awake()
{
m_pulsInvoker_Left = new PulseInvoker(OnCmdSelectItemLeft, PulseInvoke_Delay, PulseInvoke_Interval);
m_pulsInvoker_Right = new PulseInvoker(OnCmdSelectItemRight, PulseInvoke_Delay, PulseInvoke_Interval);
m_pulsInvoker_Up = new PulseInvoker(OnCmdSelectItemUp, PulseInvoke_Delay, PulseInvoke_Interval);
m_pulsInvoker_Down = new PulseInvoker(OnCmdSelectItemDown, PulseInvoke_Delay, PulseInvoke_Interval);
}
protected virtual void Update()
{
m_pulsInvoker_Left.Update(Time.deltaTime);
m_pulsInvoker_Right.Update(Time.deltaTime);
m_pulsInvoker_Up.Update(Time.deltaTime);
m_pulsInvoker_Down.Update(Time.deltaTime);
}
public void ExecuteCommand(EnumCommand cmd, bool cancel)
{
if (!cancel)
{
switch (cmd)
{
case EnumCommand.SelectItemLeft:
m_pulsInvoker_Left.SetActive();
OnCmdSelectItemLeft();
break;
case EnumCommand.SelectItemRight:
m_pulsInvoker_Right.SetActive();
OnCmdSelectItemRight();
break;
case EnumCommand.SelectItemUp:
m_pulsInvoker_Up.SetActive();
OnCmdSelectItemUp();
break;
case EnumCommand.SelectItemDown:
m_pulsInvoker_Down.SetActive();
OnCmdSelectItemDown();
break;
case EnumCommand.Enter:
if (OnCmdEnter())
{
m_pulsInvoker_Left.DisActive();
m_pulsInvoker_Right.DisActive();
m_pulsInvoker_Up.DisActive();
m_pulsInvoker_Down.DisActive();
}
break;
case EnumCommand.Back:
OnCmdBack();
break;
case EnumCommand.OptionMenu:
OnCmdOptionMenu();
break;
}
}
else
{
switch (cmd)
{
case EnumCommand.SelectItemLeft:
m_pulsInvoker_Left.DisActive(); break;
case EnumCommand.SelectItemRight:
m_pulsInvoker_Right.DisActive(); break;
case EnumCommand.SelectItemUp:
m_pulsInvoker_Up.DisActive(); break;
case EnumCommand.SelectItemDown:
m_pulsInvoker_Down.DisActive(); break;
}
}
}
protected virtual void OnCmdSelectItemLeft() { }
protected virtual void OnCmdSelectItemRight() { }
protected virtual void OnCmdSelectItemUp() { }
protected virtual void OnCmdSelectItemDown() { }
protected virtual void OnCmdOptionMenu() { }
protected virtual bool OnCmdEnter() => false;
protected virtual void OnCmdBack() { }
protected abstract void OnSelectMenuChanged();
}
public enum EnumCommand
{
SelectItemLeft,
SelectItemRight,
SelectItemUp,
SelectItemDown,
Enter,
Back,
OptionMenu
}
2024-08-16 17:26:28 +08:00
}