SuperAPI AI 工具集

bevy-input-handling

编程与开发

查看项目

更新于 10-16 06:08

技能介绍

用途

本技能用于在 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。