Bevy Shooter 是一个“薄路由”技能,用于在 Bevy 0.20 中搭建 2D 或俯视角射击游戏循环。它不自己实现完整玩法,而是把具体领域工作交给一组 Bevy 子技能处理。
用途
当你需要实现一个射击循环——瞄准、把投射物作为实体、以及波次生成——可以加载本技能。它负责把不同职责路由到对应技能:瞄准与开火交给 bevy-input-handling,伤害交给 bevy-combat-system,生成交给 bevy-game-loop-waves,射击与空间查询交给 bevy-spatial-queries。
ECS 结构
组件以纯数据形式保存该类型的每实体标志,本文件不命名新的引擎类型。资源通过 bevy-data-resources 保存运行期计数器(分数、波次索引、随机种子)。系统在 Update 或来自 bevy-master 的固定时间步中读取这些组件;当后续系统必须看到前一个系统的结果时,用 .chain() 排序。玩法模式切换通过 bevy-state-machines 处理,不要自行发明类型插件。
主要能力与示例
文档给出了若干可直接参考的代码片段。投射物是一个带速度的实体,飞船是另一个组件;开火负责生成,运动负责积分,两者接触不同数据,因此可以并行运行。命中扫描(hitscan)通过比较平移量,在射程内选出最近目标,然后在读取循环结束后施加伤害。当投射物到达受击区域时会被销毁;当两者在同一调度中写入投射物实体时,应在 fly 之后链式调用 collide。波次索引是一个资源,生成敌人会消耗预算,与 bevy-game-loop-waves 保持一致。
使用方式
依赖声明为 bevy = "0.20"。示例展示了 fire、fly、hitscan、collide、spawn_wave 等系统函数,以及通过 add_systems 注册系统的方式。文档还给出所有权表:单个实体上的数据由组件持有,由某个系统通过 Query 修改,运行在 Update 或 FixedMain;整个应用的一个值由资源持有,由某个系统修改,在 Startup 插入,之后由读取它的调度使用;生成通过 Commands 完成;必须避免竞态的先后顺序用 .chain() 保证;插件边界由 Plugin 的 build 注册系统与资源。借用规则要求:两个都可变查询同一组件的系统必须排序(.chain())或拆分,使只有一个写入;不相关的系统保持并行。
适用场景
适合需要以惯用 ECS 方式组织 Bevy 射击游戏循环的开发者,尤其是希望把瞄准、伤害、波次、空间查询等职责清晰拆分并路由到专门技能的场景。
限制
本技能是路由,不拥有第二套实现。不要在文档 URL 中固定 /0.20.0/,链接应保持在最新分支,0.20 目标只在正文中说明一次。不要从两个无序系统可变查询同一组件。不要在此发明物理、导航、网络或 XR crate,本技能只命名有文档的 Bevy crate 与模块。不要在同一投射物的可变查询内部销毁该投射物,销毁应通过 Commands 完成。当 fire 与 fly 接触不同数据时不要链式调用它们;只有当 collide 与 fly 在同一调度运行且射击必须先移动再做范围检测时,才在 fly 之后链式调用 collide。不要发明类型 API,Bevy 代码应保持惯用 ECS 并只使用有文档的 Bevy API。不要在此选择物理或网络 crate。
相关技能
前置技能包括 bevy-master(ECS 所有权与调度)和 bevy-ecs-composition(生成与查询形态)。互补技能包括 godot-genre-shooter(Godot 引擎上的射击,同等深度)、bevy-input-handling、bevy-combat-system、bevy-game-loop-waves、bevy-spatial-queries。下游消费者:无。