用途
当任务目标需要推进(例如击杀、拾取后进度计数变化)时使用本技能。它负责把任务定义、运行进度和阶段变化组织成 Bevy ECS 结构,让目标可以在不引入额外任务 crate 的前提下按阶段推进。请注意:授予任务的对话逻辑由 bevy-dialogue-system 处理,本技能只关注目标推进。
主要能力
- 用
Resource保存整局运行期使用的任务定义表QuestCatalog,每个任务定义为 id 加一组目标(objectives)。 - 用
Component(QuestProgress)挂到队伍实体上,记录当前激活哪些任务、每个目标已计数多少、当前处于哪个阶段。 - 用
Message表示一次性的客观事实(命中、拾取、任务推进),通过MessageReader<ObjectiveFact>读取并累加目标计数。 - 阶段变化:当目标计数达到要求后,将
QuestProgress的 stage 从 Active 改为 Complete。完成后的奖励数据留给其他技能(如库存或经济技能)读取。 - 系统调度:在
Update或固定时间步中修改组件;当顺序必须保证(例如伤害必须先于死亡结算)时使用.chain()排序。
使用方式
依赖为 bevy = "0.20"。典型结构如下:定义 QuestId、QuestStage、ObjectiveDef、QuestDef 以及 QuestCatalog(Resource);队伍实体上挂 QuestProgress(Component),其中包含 quest 与 objectives。接受任务时(例如在 Startup)通过 Commands 为队伍实体插入 QuestProgress。随后在 Update 中运行 apply_facts,读取 ObjectiveFact 消息并累加对应目标计数,达到 required 后把阶段改为 Complete。
一个完整的 QuestPlugin 示例会:初始化 QuestCatalog 资源、注册 ObjectiveFact 消息、在 Startup 接受任务、在 Update 运行 apply_facts。
适用场景
- 需要按阶段推进的任务目标系统。
- 希望任务定义与运行进度分离(定义在 Resource,进度在 Component)。
- 需要唯一的任务进度写入者,避免多个系统并发修改同一组件产生竞态。
限制与约束
- 目标版本为 Bevy 0.20+,核心类型包括
Component、Resource、Query、Commands、Startup、Update、Fixed/FixedMain、.chain()、Plugin、DefaultPlugins、MinimalPlugins。消息与观察者 API 见 bevy-events-messaging。 - 不得让两个无序系统同时可变查询同一组件;如冲突必须用
.chain()排序或拆分,只保留一个写入者。 - 本技能只命名官方文档中已有的 Bevy crate 与模块,不虚构 API 或未具名的第三方 crate。
- 不要把进度计数写回
QuestCatalog;不要让对话系统写入QuestProgress。 - 文档链接保持在不带版本号的
latest页面。
相关技能
前置:bevy-master、bevy-ecs-composition、bevy-dialogue-system、bevy-data-resources、bevy-events-messaging。互补:bevy-state-machines、godot-quest-system。主入口:bevy-master。下游消费者:暂未提供。