Unity输入控制封装
1、使用场景:
键盘输入控制
2、封装意义:
采用事件注册派发机制,降低了各个控制对象之间的耦合性,提高了控制方法的复用性
3、具体实现:
C#
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);
}
}
}
测试:
C#
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;
}
}
}
效果:
评论