用途
Bevy Educational 是一个“瘦路由”(thin router)技能,用于在 Bevy 0.20 中搭建教育类答题循环。它本身不实现完整的领域逻辑,而是把提示语、选项和进度标记的领域工作路由到下方关联的 Bevy 技能中。
适用场景:需要处理提示(prompts)、答案(answers)和进度标记(progress flags)时加载本技能。
ECS 结构
- 组件(Component)以纯数据形式保存一个提示语以及每个选项。
- 资源(Resource)保存已评分答案数量和正确数量。
- 系统先选择选项,再对其评分;
.chain()保证评分在选择之后运行。 - 调度:游戏模式切换通过 bevy-state-machines 处理。
依赖声明:
[package]
name = "educational"
version = "0.1.0"
edition = "2021"
[dependencies]
bevy = "0.20"
主要能力与代码示例
一个提示、两个选项、一个进度资源:
#[derive(Component)]
struct Prompt {
text: String,
}
#[derive(Component)]
struct Choice {
label: String,
correct: bool,
picked: bool,
graded: bool,
}
#[derive(Resource, Default)]
struct LessonProgress {
answered: u32,
correct: u32,
}
fn spawn_lesson(mut commands: Commands) {
commands.spawn(Prompt {
text: "Which way is north?".to_string(),
});
commands.spawn(Choice {
label: "Up".to_string(),
correct: true,
picked: false,
graded: false,
});
commands.spawn(Choice {
label: "Down".to_string(),
correct: false,
picked: false,
graded: false,
});
commands.init_resource::<LessonProgress>();
}
fn pick_first(mut choices: Query<&mut Choice>) {
for mut choice in &mut choices {
if choice.correct && !choice.graded && !choice.picked {
choice.picked = true;
break;
}
}
}
fn grade(mut progress: ResMut<LessonProgress>, mut choices: Query<&mut Choice>) {
for mut choice in &mut choices {
if choice.picked && !choice.graded {
progress.answered = progress.answered.saturating_add(1);
if choice.correct {
progress.correct = progress.correct.saturating_add(1);
}
choice.graded = true;
choice.picked = false;
}
}
}
pub struct LessonPlugin;
impl Plugin for LessonPlugin {
fn build(&self, app: &mut App) {
app.add_systems(Startup, spawn_lesson)
.add_systems(Update, (pick_first, grade).chain());
}
}
pick_first 和 grade 都会写入 Choice,因此它们保持链式顺序。
只读进度用于展示:
#[derive(Resource, Default)]
struct LessonProgress {
answered: u32,
correct: u32,
}
fn show_score(progress: Res<LessonProgress>) {
let _answered = progress.answered;
let _correct = progress.correct;
}
pub struct ScorePlugin;
impl Plugin for ScorePlugin {
fn build(&self, app: &mut App) {
app.init_resource::<LessonProgress>()
.add_systems(Update, show_score);
}
}
课程数据映射
| 需求 | Bevy 惯用法 |
|---|---|
| 提示与选项 | 实体加上下方链接的领域技能 |
| 课程统计 | 一个 Resource |
| 一次性循环通知 | bevy-events-messaging |
路由
- bevy-ui-text - 提示语。
- bevy-ui-layout - 选项。
- bevy-save-load - 进度存档。
- bevy-state-machines - 课程模式。
范围
提示、选项和进度资源是你自己定义的游戏数据。UI 文本和布局仍由链接的 UI 技能负责。
专家知识要点
目标:Bevy 0.20+。
核心 ECS 类型:Component、Resource、Query、Commands、Startup、Update、Fixed / FixedMain(bevy::time)、.chain()、Plugin、DefaultPlugins、MinimalPlugins。消息和观察者属于一个所有权槽位,其 API 见 bevy-events-messaging。除非 .chain() 对冲突的系统排序,否则系统并行运行。
状态归属
| 部分 | 所有者 | 谁可修改 | 调度 |
|---|---|---|---|
| 单个实体上的数据 | Component | 一个系统通过 Query | Update 或 FixedMain |
| 整个应用的一个值 | Resource | 一个系统 | Startup 插入,然后由读取它的调度 |
| 生成 | Commands | 生成系统 | 初始世界用 Startup;运行时生成用后续调度 |
| 不能竞态的顺序 | .chain() |
仅被链式的系统 | 同一调度 |
| 插件边界 | Plugin | build 注册系统和资源 | 应用运行之前 |
借用规则:两个系统若都可变查询同一组件,必须排序(.chain())或拆分使只有一个写入。无关系统保持并行。这是 ECS 页面规则,不是对系统集 API 的猜测。
决策
| 如果你需要 | 这样做 | 不要 |
|---|---|---|
| 每实体数据 | Component + Query | 用一个结构体存所有实体的字段 |
| 应用级配置或时钟 | Resource | 把值复制到每个实体 |
| 稳定模拟步长 | FixedMain 和 Fixed 时钟 | 把模拟绑到原始帧 Update |
| 启动生成 | Startup 中的 Commands | 从渲染系统生成 |
| 非共享状态的跨系统通知 | bevy-events-messaging 中的消息或观察者槽位 | 在本文件中发明新事件类型 |
| 文档集之外的 API | 阅读链接的 Bevy 页面 | 编造的 crate 或 API |
加载 references/ecs-ownership.md 查看所有权表。
禁止事项
- 不要在文档 URL 中固定
/0.20.0/。原因:链接保持在最新版;0.20 目标只在正文中声明一次。 - 不要从两个无序系统可变查询同一组件。原因:除非
.chain()排序,调度会并行运行系统。 - 不要在此发明物理、导航、网络或 XR crate。原因:本技能只命名有文档的 Bevy crate 和模块。
- Bevy 代码中不要使用场景树类型。原因:Bevy 代码保持惯用 ECS,只使用有文档的 Bevy API。
- 不要发明类型化 API。原因:Bevy 代码保持惯用 ECS,只使用有文档的 Bevy API。
- 不要在此选择物理或网络 crate。原因:Bevy 代码保持惯用 ECS,只使用有文档的 Bevy API。
参考
bevy-master 上的库固定版本保持 0.20.0。官方链接保持在无版本号的 learn 页面。
官方文档:
- Assets - 官方资源目录。未选择第三方 crate。
- Examples - 最新分支上的示例树。
- ECS - Component、systems、Query、Startup、Update 和
.chain()。 - Plugins - Plugin、DefaultPlugins、MinimalPlugins 和 add_plugins。
相关技能
前置:
- bevy-master - ECS 所有权和调度。
- bevy-ecs-composition - 生成和查询形态。
互补:
- bevy-ui-text - 提示语。
- bevy-ui-layout - 选项。
- bevy-save-load - 进度存档。
- bevy-state-machines - 课程模式。
下游 / 消费者:无。此路由不拥有第二个实现。
主技能:bevy-master - Bevy 路由。