输入系统
本模块由 InputInfo 与 InputManager 两个核心类组成,提供对键盘与鼠标输入的封装,并与事件系统(EventManager)深度结合,实现输入驱动事件触发的能力。
注意!本模块暂时仅针对旧版输入系统进行拓展和封装,若您的项目无需旧版输入系统,该模块则无需开启。框架会自动针对您是否导入新版输入系统(Input System)来决定是否启动该模块。
您也可前往全局设置中开启“强制关闭新版输入系统”来强行启动该模块。
1. 设计目的
Unity 内置的旧版输入系统(UnityEngine.Input)无法直接支持事件式架构,本模块将原始输入包装为可管理、可注册、可修改的输入行为:
- 将键盘 / 鼠标输入封装为结构化
InputInfo - 支持为按键绑定事件(按下、抬起、长按)
- 支持动态修改输入绑定
- 支持“一次性捕获输入”
- 自动分发轴向输入(Horizontal / Vertical)
2. InputInfo
源文件位置:Framework/Input/InputInfo.cs
该类型用于描述单次输入行为,是输入系统的基础单位。
支持两类输入:键盘(Key)、鼠标(Mouse)。
2.1 枚举定义
E_KeyOrMouse
- Key —— 键盘
- Mouse —— 鼠标
E_InputType
- Down —— 按下
- Up —— 抬起
- Always —— 长按/持续触发
2.2 字段说明
| 字段 | 类型 | 含义 |
|---|---|---|
| keyOrMouse | E_KeyOrMouse | 输入设备类型(键盘/鼠标) |
| inputType | E_InputType | 输入触发条件 |
| key | KeyCode | 键盘按键(当 keyOrMouse = Key) |
| mouseID | int | 鼠标按键(0 左键 / 1 右键 / 2 中键) |
2.3 构造函数
键盘输入
new InputInfo(E_InputType inputType, KeyCode key)
鼠标输入
new InputInfo(E_InputType inputType, int mouseID)
3. InputManager
源文件:Framework/Input/InputManager.cs
本类为 输入模块的核心管理器,统一监听所有键盘、鼠标输入并与事件系统(EventManager)连接。
3.1 模块启用检查
模块初始化时检查:
if (!GlobalConfig.EnableInputModule)
若未启用输入模块且调用了输入模块的代码,将会输出错误日志并停止运行。
3.2 字典结构
输入行为被注册到字典:
Dictionary<E_EventType, InputInfo>
每一个事件类型绑定一个 InputInfo,对应一个输入动作。
4. 输入监听流程
4.1 按键绑定事件
支持将键盘/鼠标输入绑定到你的事件系统:
键盘绑定
InputManager.Instance.ChangeKeyboardInfo(
E_EventType.E_Player_Jump,
KeyCode.Space,
InputInfo.E_InputType.Down
);
鼠标绑定
InputManager.Instance.ChangeMouseInfo(
E_EventType.E_Player_Fire,
0,
InputInfo.E_InputType.Down
);
绑定完成后,InputManager 会在 Update 中自动检测,并触发对应事件。
5. 输入触发逻辑
在内部的 InputUpdate() 中:
键盘输入检测
Input.GetKeyDown(key);
Input.GetKeyUp(key);
Input.GetKey(key);
鼠标输入检测
Input.GetMouseButtonDown(id);
Input.GetMouseButtonUp(id);
Input.GetMouseButton(id);
若检测到匹配行为,将自动触发:
EventManager.Instance.EventTrigger(eventType);
6. 轴向输入(Axis)支持
模块内置检查:
Input.GetAxis("Horizontal")
Input.GetAxis("Vertical")
并自动触发事件:
E_Input_HorizontalE_Input_Vertical
示例:
EventManager.Instance.AddEventListener<float>(
E_EventType.E_Input_Horizontal,
value => MoveHorizontal(value)
);
7. 动态捕获“一次性输入”
支持在运行时捕获用户下一次键盘/鼠标输入:
InputManager.Instance.GetInputInfo(info =>
{
LogUtil.info("玩家按下了:" + info.key + " / 鼠标:" + info.mouseID);
});
此打印信息是使用框架自带的LogUtil来代替Unity的Debug/print方法。详情请见日志工具
应用场景:
- 设置界面的“按任意键修改绑定”
- 输入注册热键
- UI 交互学习按键等
8. 启用输入检测
手动启用 / 禁用输入检测:
InputManager.Instance.ToggleInputCheck(true);
常用于暂停菜单、剧情模式等。
9. 移除输入绑定
InputManager.Instance.RemoveInputInfo(E_EventType.E_Player_Jump);
10. 模块总结
| 能力 | 支持 |
|---|---|
| 键盘输入 | ✔ |
| 鼠标输入 | ✔ |
| 长按检测 | ✔ |
| 输入 → 事件系统桥接 | ✔ |
| 动态输入捕获 | ✔ |
| 轴向输入分发 | ✔ |
| 启停输入检测开关 | ✔ |
| 自动 Update | 由 MonoManager 驱动 |
该模块非常适合快速开发、小型原型、工具界面等场景。