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,管理系统“什么时候”和“如何”运行,例如:用Label、System Set、State、Run Criteria和Stage来确定[系统的执行顺序]。