用途
本技能用于在 Bevy 0.20+ 项目中处理玩家输入。当某个系统需要读取键盘、鼠标或手柄状态时加载它。技能中出现的名称均来自 Bevy 0.20 的 bevy::input 模块。
主要能力
- 键盘:通过 Res<ButtonInput<KeyCode>> 读取物理键(布局稳定),Res<ButtonInput<Key>> 读取逻辑键。示例使用 pressed、just_pressed、just_released。
- 鼠标:mouse_button_input_system 从 MouseButtonInput 写入 ButtonInput<MouseButton>。AccumulatedMouseMotion 与 AccumulatedMouseScroll 是每帧重置的资源;MouseMotion 与 MouseWheel 是底层事件。
- 手柄:Gamepad 保存已连接手柄的元数据(GamepadButton、GamepadAxis)。连接与轴变化以 GamepadConnectionEvent、GamepadAxisChangedEvent、GamepadButtonChangedEvent 到达。GamepadRumbleRequest 是力反馈事件。
- 插件与调度:InputPlugin 提供键盘、鼠标、手柄和触摸输入,随常规 app 插件一起提供。InputSystems 标记刷新这些数据的系统。应在 Update(或已链接的调度)中读取这些资源。
使用方式
依赖声明为 bevy = "0.20"。按键边沿应在 Update 中读取;FixedUpdate 每帧可能运行零次或多次,在其中采样按键会丢失或重复,因此应把边沿存到意图组件上,由固定步长消费。
示例包括:
- 读取 WASD/方向键生成 MoveIntent(axis 与 jump)。
- 用 AccumulatedMouseMotion 旋转相机。
- 手柄摇杆径向死区:丢弃漂移后重新缩放剩余范围,使满偏仍达到长度 1。
- 跳跃缓冲:保留提前几帧落地的按键。
- 追踪最后活跃设备(键盘或手柄)。
插件示例注册 JumpBuffer 资源、初始化 LastDevice,并在 Update 中按顺序添加 read_pad、track_device、arm_jump_buffer。
从 Godot 迁移对照
- 动作刚按下:对 KeyCode 或 MouseButton 使用 ButtonInput::just_pressed。
- 动作按住:ButtonInput::pressed。
- 物理 WASD 与符号键:位置用 KeyCode,字符用 Key。
- 鼠标视角增量:AccumulatedMouseMotion(每帧重置)。
- 控制器:Gamepad 加上上述手柄事件。
适用场景
适用于需要读取键盘、鼠标、手柄状态的 Bevy 游戏系统,例如角色移动意图、相机视角控制、手柄摇杆输入、跳跃缓冲与设备切换。
限制与规则
- 键盘、鼠标、手柄状态位于 ButtonInput 与 Gamepad 上;命名动作、跳跃缓冲、摇杆径向死区、最后活跃设备是需要自行定义的资源。字形美术属于 UI 关注点。
- 不要在文档 URL 中固定 /0.20.0/,链接保持指向最新版。
- 不要从两个无序系统可变查询同一组件;调度会并行运行系统,除非用 .chain() 排序。
- 不要在本技能中引入物理、导航、网络或 XR crate;只使用有文档的 Bevy crate 与模块。
- 不使用 Godot 的输入映射、事件或设备类型;不使用第三方输入 crate;不使用本文件未打开的 API(引用的按钮方法为 pressed、just_pressed、just_released)。
- 状态归属:单实体数据用 Component,由单个系统通过 Query 修改;全应用单值用 Resource;生成用 Commands;不可竞争的排序用 .chain();插件边界用 Plugin。
相关技能
前置:bevy-master、bevy-ecs-composition。互补:bevy-character-movement、bevy-camera-systems、godot-input-handling。下游:bevy-audio-systems。主路由:bevy-master。