输入系统

本模块由 InputInfoInputManager 两个核心类组成,提供对键盘与鼠标输入的封装,并与事件系统(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 字段说明

字段类型含义
keyOrMouseE_KeyOrMouse输入设备类型(键盘/鼠标)
inputTypeE_InputType输入触发条件
keyKeyCode键盘按键(当 keyOrMouse = Key)
mouseIDint鼠标按键(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_Horizontal
  • E_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 驱动

该模块非常适合快速开发、小型原型、工具界面等场景。