用途:用于构建设备无关、可持久化、可重绑定的游戏输入动作与提示,适用于手柄热插拔/重排、多玩家共享设备、鼠标捕获、焦点丢失、Steam Deck 与自适应硬件等场景。目标是把 Bevy 的帧级原始输入统一翻译为逻辑动作状态,供表现层与固定步长模拟共同消费。
主要能力:原始输入在 PreUpdate 的 InputSystems 中更新,翻译系统应在其后运行,例如 app.init_resource::<ActionBuffer>().add_systems(PreUpdate, translate_physical_input.after(InputSystems))。动作使用稳定序列化 ID(如 gameplay.jump、menu.confirm、camera.look),绑定、标签、提示、存档与分析均引用这些 ID。对于顺序敏感的按键边沿,应将底层键盘/鼠标/手柄消息翻译为有序队列;持续状态与过滤后的轴可保存最新值。
Bevy 0.19 中手柄是实体,可用 Query<(Entity, &Gamepad)> 查询,通过 gamepad.get(GamepadAxis::LeftStickX)、just_pressed(GamepadButton::South) 读取。连接变化用 GamepadConnectionEvent,连接/按钮/轴相对顺序重要时用 GamepadEvent。每设备过滤通过其 GamepadSettings 组件配置内置死区、外校准、响应曲线与最终钳制,避免在游戏逻辑中重复加死区。
使用方式与限制:帧输入不等于固定步长输入,固定模拟一帧可能运行 0/1/多 tick。应保留有序按下/释放转换直到某个固定 tick 消费,累积相对运动并在首个可用 tick 一次性排空,持续按键与绝对轴复制到每个固定 tick,切勿在每次 FixedUpdate 迭代中独立重读 just_pressed 或 AccumulatedMouseMotion。回滚/网络模拟需将桥接输出转为以模拟 tick 为键的显式命令帧并可重放。鼠标捕获通过主窗口 CursorOptions 隐藏光标并在游戏拥有视角输入时请求 CursorGrabMode::Locked;焦点丢失时暂停或置空输入、释放捕获、合成必要的动作释放并清除相对运动,仅在用户主动手势后重新获取。键盘状态在焦点丢失时由 Bevy 释放,手柄状态则独立于窗口焦点,动作层仍需统一策略防止卡键。
适用场景:需要可重绑定动作、跨设备提示、确定性固定步长输入与回滚的 Bevy 0.19 项目。其余细节(如具体绑定语法、上下文与冲突处理)资料未完整提供,可参见 bevy-a11y、bevy-core-concepts、bevy-testing 及 Bevy gamepad 模块。