Latest commit d7a897d

系统

相关的官方文档:[ecs_guide],[startup_system],[system_param]


用 Rust 编写的函数,经由 Bevy 运行后就是系统,是实现游戏逻辑的地方。

这些函数只能接受特殊的参数类型来指定要访问的数据。如果使用了不支持的参数类型,编译时会报错,查看[Error adding function as system]。这些参数类型是:

  • Res/ResMut:访问资源;
  • Query:访问实体的组件;
  • Commands:创建或销毁实体、组件和资源;
  • EventWriter/EventReader:发送或接收事件。
#![allow(unused)]
fn main() {
fn debug_start(
    // 访问资源
    start: Res<StartingLevel>
) {
    eprintln!("Starting on level {:?}", *start);
}
}

可以把系统的参数组合成元组(嵌套)。

#![allow(unused)]
fn main() {
fn comples_system(
    (a, mut b): (Res<ResourceA>, ResMut<ResourceB>),
    // 这个资源可能不存在,所以把它包在一个 Option 里
    mut c: Option<ResMut<ResourceC>>,
) {
    lf let Some(mut c) = c {
        // 做一些事
    }
}
}

顶层系统参数或元组成员的最大数量是 16 个。如果要绕过限制,可以把它们分组或嵌套成元组。

运行时

用 [App Builder] 把系统添加到 Bevy 即可运行系统:

fn main() {
    App::new()
        // ...

        // 仅运行一次
        .add_startup_system(init_menu)
        .add_startup_system(debug_start)

        // 每帧运行一次
        .add_system(move_player)
        .add_system(enemies_ai)

        // ...
        .run();
}

随着游戏项目越来越复杂,需要用更多功能来设置 App Buidler,管理系统“什么时候”和“如何”运行,例如:用LabelSystem SetStateRun CriteriaStage来确定[系统的执行顺序]。