用途
本技能用于在 Godot 引擎中处理键盘、鼠标、手柄与触摸输入,并提供正确的输入缓冲与无障碍支持。适用于搭建玩家控制、实现输入系统,或添加手柄/无障碍功能。
主要能力
技能以脚本形式提供多类输入处理能力:
- 输入缓冲:advanced_input_buffer.gd 提供逐帧精确的输入缓冲,用于响应灵敏的跳跃、冲刺与连招链;input_buffer.gd 提供带
_physics_process衰减的定时动作缓冲,使窗口与 CharacterBody 的消费节奏一致,而非跟随渲染帧率。 - 运行时重绑定:safe_runtime_rebind.gd 支持动态输入重绑定,含冲突检测,并持久化到
user://input_rebinds.cfg。 - 摇杆死区:analog_deadzone_manager.gd 提供径向死区管理,消除漂移同时保持自然的跟随感。
- 触摸手势:multi_touch_gestures.gd 处理触摸、拖拽与捏合缩放,兼容移动端与触摸屏。
- 输入回声过滤:input_echo_filter.gd 过滤回声事件,区分 UI 的按住导航与游戏内的一次性动作。
- 鼠标捕获:mouse_capture_manager.gd 提供稳健的鼠标捕获与灵敏度缩放逻辑,用于 FPS 与鼠标密集型系统。
- 无障碍支持:hold_toggle_accessibility.gd 在软件侧支持用户自定义的“按住”与“切换”偏好。
- 提示图标切换:glyph_prompt_manager.gd 根据最后活跃设备在键盘与手柄 UI 提示之间实时切换。
- 动作状态机:action_state_machine.gd 跟踪动作生命周期(“刚按下”“按住”“释放”),用于复杂状态逻辑。
- 输入优先级:unhandled_input_priority.gd 演示正确使用
_unhandled_input,防止游戏逻辑泄漏到 UI。 - 虚拟输入注入:virtual_input_injector.gd 通过
Input.parse_input_event注入输入,用于 CI 教程或 AI 辅助,而非物理硬件。 - 连招校验:combo_validator.gd 提供滚动定时序列缓冲,用于特殊招式校验(格斗/动作 RPG)。
- 输入回放:input_replay_buffer.gd 提供逐帧标记的捕获与通过
parse_input_event的确定性回放。
使用方式
技能按场景提供“必须加载”的脚本触发规则,例如:跳跃/冲刺/土狼时间手感需加载 input_buffer.gd 与 advanced_input_buffer.gd;设置重映射 UI 需加载 safe_runtime_rebind.gd;模拟摇杆移动需加载 analog_deadzone_manager.gd,且不得在无径向死区的情况下直接使用原始轴;提示“按 X / 按 E”需加载 glyph_prompt_manager.gd;UI 导航与游戏确认需加载 input_echo_filter.gd;游戏与菜单点击需加载 unhandled_input_priority.gd。同时给出“不要加载”的对照表,避免在特定场景引入无关脚本。
输入传播顺序为:_input(event) 高优先级全局拦截,用于开发控制台或调试覆盖层;_gui_input(event) 由 Control 节点(UI)处理,若 UI 元素消费事件(如点击按钮)会调用 accept_event() 停止传播;_unhandled_input(event) 仅在没有 UI 元素消费事件时到达,专家模式建议将所有游戏逻辑(跳跃、射击)放在此处,防止与菜单交互时误触发。
InputMap 最佳实践:避免物理按键检查,在 Project Settings > Input Map 中定义语义动作(如 move_left、interact)。模拟摇杆存在漂移,必须使用 analog_deadzone_manager.gd,优先使用 Input.get_vector() 实现圆形死区,切勿将轴相减成方形死区。游戏逻辑在 _physics_process / _unhandled_input 中采样动作,绝不使用 KEY_* / MOUSE_BUTTON_* 分支;暂停/取消必须是 InputMap 动作(如 ui_cancel),以便重绑定与非 QWERTY 布局正常工作。
多模态输入与 UI 图标:鼠标瞄准在 _unhandled_input() 中处理 InputEventMouseMotion 相对移动;摇杆移动在 _physics_process() 中经死区处理后轮询向量。动态图标切换必须使用 glyph_prompt_manager.gd,不要在 HUD 组件中手写 event is InputEventJoypadButton 检测。
专家扩展:输入缓冲必须使用 input_buffer.gd 与 advanced_input_buffer.gd;土狼时间由移动类技能负责,本技能不重复实现;多人输入同步不应在此 RPC sync_input,应路由到 godot-multiplayer-networking;虚拟注入必须使用 virtual_input_injector.gd;连招序列必须使用 combo_validator.gd;确定性回放必须使用 input_replay_buffer.gd。
适用场景
适用于 Godot 项目中玩家控制搭建、输入系统实现、手柄与无障碍功能添加,包括平台跳跃的跳跃缓冲与土狼时间、FPS 鼠标视角与捕获、格斗连招校验、移动端触摸手势、设置界面重映射、UI 与游戏输入隔离、输入回放与虚拟注入测试等。
限制与禁止事项
- 绝不在
_process()中轮询游戏动作输入,应使用_physics_process()或_unhandled_input(),因为_process()依赖帧率,低帧率下会丢输入。 - 绝不使用硬编码按键检查(如
KEY_W),应始终使用 InputMap 动作,否则无法重绑定且破坏非 QWERTY 布局兼容性。 - 绝不忽略模拟摇杆死区,0.05 幅度的漂移会导致意外移动,需在代码或设置中实现径向死区(非轴向)。
- 绝不假设单一输入设备,玩家可能在会话中切换键盘与手柄,应使用
Input.joy_connection_changed动态更新 UI 提示。 - 绝不用
_input()处理游戏动作,_input()会对所有事件(含 UI)触发,应使用_unhandled_input()。 - 绝不在快节奏游戏中省略输入缓冲,玩家在落地前 50ms 按下跳跃会丢失输入,应实现 100-150ms 缓冲以获得“紧致”手感。
- 绝不用
Input.is_action_pressed()处理一次性触发,它在按住期间每帧返回 true,跳跃、攻击与切换应使用_just_pressed。 - 绝不在多处实现手动的“按住 vs 切换”逻辑,应集中到设置或输入包装器中以保证无障碍一致性。
- 绝不在 UI 导航中忘记处理
InputEvent.is_echo(),回声事件(键盘重复)应移动菜单,但很少应触发“确认”或“返回”。 - 绝不在没有“释放”快捷键的情况下捕获鼠标,若游戏崩溃或阻塞
ui_cancel,用户会被困住,应始终提供鼠标捕获的备用退出方式。
参考资料
技能提供按需查阅的深度配方文档:input-event-processing.md(缓冲/土狼时间/多人同步)、expert-input-extensions.md(虚拟注入/连招/回放)、inputmap-best-practices.md(InputMap 与设备 ID)。官方文档链接涵盖 Using InputEvent、Input examples、Controllers/gamepads/joysticks、Controller vibration、Mouse and input coordinates、Customizing the mouse cursor、Handling quit requests、Input、InputMap、InputEvent、Idle and Physics Processing、Control 等。相关技能包括前置的 godot-project-foundations、godot-gdscript-mastery,互补的 godot-ui-containers、godot-signal-architecture、godot-autoload-architecture、godot-characterbody-2d、godot-camera-systems、godot-state-machine-advanced、godot-save-load-systems、godot-adapt-desktop-to-mobile,下游消费者 godot-genre-platformer、godot-genre-shooter-fps、godot-genre-fighting、godot-multiplayer-networking,以及主路由 godot-master。