using System.Collections; using System.Collections.Generic; using UnityEngine; public struct InputCommand { public KeyCode key; public float time; } // 处理输入逻辑,不涉及读取输入,只处理逻辑 public class InputManager : SingletonMB { PCController _pc; List m_CommandQueue = new List(); const float threshold = 3; PCController pc { get { if (_pc == null) _pc = PCController.instance; return _pc; } } public void OnMoveRight() { UnitState.MoveParam move = new UnitState.MoveParam(); move.isRight = true; move.key = "d"; pc.unitState.ChangeState(UnitState.EUnitState.Move, move); } public void OnMoveLeft() { UnitState.MoveParam move = new UnitState.MoveParam(); move.isRight = false; move.key = "a"; pc.unitState.ChangeState(UnitState.EUnitState.Move, move); } public void OnTurnBack() { } public void OnJump() { pc.unitState.ChangeState(UnitState.EUnitState.Jump, new UnitState.JumpParam()); } public void OnAttack() { pc.unitState.ChangeState(UnitState.EUnitState.Attack, new UnitState.SkillParam()); } public void OnUpdate() { foreach (KeyCode vKey in System.Enum.GetValues(typeof(KeyCode))) { if (Input.GetKeyDown(vKey)) { InputCommand cmd = new InputCommand(); cmd.key = vKey; cmd.time = Time.time; m_CommandQueue.Add(cmd); Debug.Log(cmd.time); string cmdStr = ""; m_CommandQueue.ForEach(s => cmdStr += s.key.ToString() + ","); Debug.Log(cmdStr); } } float curTime = Time.time; int removeCount = 0; for(int i = 0; i < m_CommandQueue.Count; ++i) { if(curTime - m_CommandQueue[i].time > threshold) { removeCount++; } } m_CommandQueue.RemoveRange(0, removeCount); } public bool TryCommand(float interval = 0.5f, params KeyCode[] keys) { if (keys.Length > m_CommandQueue.Count) return false; int count = m_CommandQueue.Count; float preTime = m_CommandQueue[count - keys.Length].time; for (int i = 0; i < keys.Length; ++i) { if(keys[i] == m_CommandQueue[i + count - keys.Length].key) { if(m_CommandQueue[i + count - keys.Length].time - preTime > interval) { return false; } preTime = m_CommandQueue[i + count - keys.Length].time; } else { return false; } } m_CommandQueue.RemoveRange(count - keys.Length, keys.Length); return true; } }