输入系统InputManager

背景

  现代游戏通常需要处理多种输入设备,包括键盘、鼠标、手柄和触屏等。为了应对复杂的输入场景,Unity提供了新的输入系统InputSytem来简化和标准化输入处理。框架的输入也是基于InputSytem,所以请将项目升级为InputSystem,并在ProjectSetting中设置InputSystem。
  框架主要完成了InputSystem的前期配置,节约大量的配置和调试时间,此外提供了基础输入接口,并提供了unity内置键盘鼠标手柄和触屏等输入方式的检测api使用示例,方便开发者查阅使用。
  InputSystem基本操作方法详见官方文档

使用

升级项目的输入系统

  • InputSystem安装和配置参考:InputSystem
  • 其中InputAction在项目中已经完成初始创建,不需要额外创建:
    InputActions路径:项目路径\Assets\Scripts\Core\Manager\InputManager\InputActions.inputactions
  • 双击InputActions.inputactions文件,即可打开InputActions界面:


添加输入事件

公共输入检测

监听输入事件

通过注册InputSystem的输入事件,转由我们的事件系统去统一派发。

1
2
3
4
5
6
7
8
9
10
11
12
13
public class InputManager
{
public void OnInit()
{
// 添加对inputAction事件的监听
_inputActions.UI.Click.started += OnMouseLeftClick; // OnMouseLeftClick在下文声明
}

public void OnClear()
{
_inputActions.UI.Click.started -= OnMouseLeftClick;
}
}

完成事件转发

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// 搭配事件系统
public enum EventName
{
OnMouseLeftClick,
}

public class InputManager
{
// 转由事件系统进行统一派发
private static void OnMouseLeftClick(InputAction.CallbackContext callbackContext)
{
EventManager.Instance.Dispatch(EventName.OnMouseLeftClick);
}
}

// 外部订阅OnMouseLeftClick事件,即可接收到输入事件
EventManager.Instance.AddListener(EventName.OnMouseLeftClick, func);

私有输入检测

  上面是声明全局的输入检测,处处可通过事件系统进行订阅输入事件。对于特殊的输入检测需求,以及检测和使用频率较低的输入检测,建议于对象内部自行进行输入检测,InputManager代码后面部分也提供了检测输入的内置api使用示例,方便查阅使用。

  • 内置api使用示例:
  • 具体使用示例:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Pause : MonoBehaviour
    {
    private void Update()
    {
    // 监听esc摁键摁下
    if (Keyboard.current.escapeKey.wasPressedThisFrame)
    {
    // 打开暂停界面
    }
    }

    }