输入系统:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputManager : BaseManager<InputManager>
{
private bool isStart = false;
public InputManager()
{
MonoMgr.GetInstance().AddUpdateListener(InputUpdate);
}
private void InputUpdate()
{
if (!isStart)
return;
CheckKeyCode(KeyCode.W);
CheckKeyCode(KeyCode.S);
CheckKeyCode(KeyCode.A);
CheckKeyCode(KeyCode.D);
}
public void IsStartCheck(bool isStartCheck)
{
isStart = isStartCheck;
}
private void CheckKeyCode(KeyCode key)
{
if (Input.GetKeyDown(key))
EventManager.GetInstance().TriggerEventLisetener<object>("InputDown", key);
if (Input.GetKeyUp(key))
EventManager.GetInstance().TriggerEventLisetener<object>("InputUp", key);
}
}
测试:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class InputTest : MonoBehaviour
{
void Start()
{
InputManager.GetInstance().IsStartCheck(true);
EventManager.GetInstance().AddEventListener<object>("InputDown", CheckInputDown);
EventManager.GetInstance().AddEventListener<object>("InputUp", CheckInputUp);
}
private void CheckInputDown(object obj)
{
KeyCode code = (KeyCode)obj;
switch (code)
{
case KeyCode.W:
Debug.Log("前进");
break;
case KeyCode.A:
Debug.Log("向左");
break;
case KeyCode.S:
Debug.Log("后退");
break;
case KeyCode.D:
Debug.Log("向右");
// InputManager.GetInstance().IsStartCheck(false);
break;
default:
Debug.Log("未知");
break;
}
}
private void CheckInputUp(object obj)
{
KeyCode code = (KeyCode)obj;
switch (code)
{
case KeyCode.W:
Debug.Log("前进");
break;
case KeyCode.A:
Debug.Log("向左");
break;
case KeyCode.S:
Debug.Log("后退");
break;
case KeyCode.D:
Debug.Log("向右");
break;
default:
Debug.Log("未知");
break;
}
}
private void OnDestroy()
{
EventManager.GetInstance().RemoveEventLisetener<object>("InputDown", CheckInputDown);
EventManager.GetInstance().RemoveEventLisetener<object>("InputUp", CheckInputUp);
}
}
核心原理:update检测是否按下某个键(CheckKeyCode),如果按下则触发down或者up事件,将需要的方法绑定到down或者up事件里,并且接收一个keycode参数,根据keycode的值调用不同方法。