SuperAPI AI 工具集

bevy-genre-educational

编程与开发

查看项目

更新于 10-16 06:08

技能介绍

用途

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 路由。