Unity输入控制封装
1、使用场景:
键盘输入控制
2、封装意义:
采用事件注册派发机制,降低了各个控制对象之间的耦合性,提高了控制方法的复用性
3、具体实现:
using System.Collections; using System.Collections.Generic; using UnityEngine; /// <summary> /// 键盘/鼠标 控制类 单例 /// </summary> public class InputController : SingletonBase<InputController> { //开关控制 private bool isOn = false; public InputController() { //单例类,所以该构造函数只会 执行一次,通过Mono管理器 将MyUpdate方法实现帧更新检测 MonoMgr.GetInstance().addUpdateListener(MyUpdate); } //外部设置 控制开关 是否需要开启 public void StartOrEnd(bool isOpen) { isOn = isOpen; } public void MyUpdate() { if (!isOn) return; //WASD 键盘输入 触发 相应的事件 KeyCodeInput(KeyCode.W); KeyCodeInput(KeyCode.A); KeyCodeInput(KeyCode.S); KeyCodeInput(KeyCode.D); } private void KeyCodeInput(KeyCode key) { //某键按下 的时候 触发 按下事件(将按下的键值传递) if (Input.GetKeyDown(key)) { EventCenter.GetInstance().EventTrigger("某键按下", key); } //某键抬起 的时候 触发 抬起事件(将抬起的键值传递) if (Input.GetKeyUp(key)) { EventCenter.GetInstance().EventTrigger("某键抬起", key); } } }
测试:
using System.Collections; using System.Collections.Generic; using UnityEngine; public class InputTest : MonoBehaviour { void Start () { InputController.GetInstance().StartOrEnd(true);//开启键盘输入控制 EventCenter.GetInstance().AddListenerEvent("某键按下",PressFun);//注册键盘按下事件 EventCenter.GetInstance().AddListenerEvent("某键抬起", RaiseFun);//注册键盘抬起事件 } /// <summary> /// 键盘按下事件 /// </summary> /// <param name="key">键值</param> void PressFun(object key) { KeyCode code = (KeyCode)key; switch (code) { case KeyCode.W: Debug.Log("按下了W 前进"); break; case KeyCode.S: Debug.Log("按下了S 后退"); break; case KeyCode.A: Debug.Log("按下了A 左转"); break; case KeyCode.D: Debug.Log("按下了D 右转"); break; } } /// <summary> /// 键盘抬起事件 /// </summary> /// <param name="key">键值</param> void RaiseFun(object key) { KeyCode code = (KeyCode)key; switch (code) { case KeyCode.W: Debug.Log("松开了W 停止前进"); break; case KeyCode.S: Debug.Log("松开了S 停止后退"); break; case KeyCode.A: Debug.Log("松开了A 停止左转"); break; case KeyCode.D: Debug.Log("松开了D 停止右转"); break; } } }
效果:
评论