独占系统
独占系统是指 Bevy 不会与任何其他系统并行运行的 系统]cb::system。他们可以通过采取 &mut World
参数完全不受限制地访问整个 ECS World
。
在一个独占系统中,你可以完全控制存储在 ECS 中的所有数据。你可以做任何你想做的事情。
请注意,独占系统会限制性能,因为它阻止了多线程(没有其他东西在同一时间运行)。
独占系统的一些有用例子:
- 将各种实体和组件转储到一个文件中,以实现游戏文件的保存和加载,或从编辑器中导出场景等功能。
- 直接生成/销毁 实体,或者创建/删除 资源,实现操作没有任何延迟(不像在普通系统中使用命令)。
- 用你自己的调度算法运行任意的系统
- ...
请参阅 直接访问 World 页面,以了解如何实现的更多细节。
fn do_crazy_things(world: &mut World) {
// we can do anything with any data in the Bevy ECS here!
}
你需要向 应用 添加你的独占系统,就像普通系统一样,但你必须对它们调用 .exclusive_system()
。
不能把它们在常规的并行系统之间排序,独占系统总是在以下的一个地方运行:
.at_start()
: 在一个 阶段 的开始处.at_end()
: 在一个 阶段 结束时,在常规系统的 命令 被应用之后.before_commands()
: 在一个 阶段 内的所有常规系统之后,但在 命令 被应用之前 (如果你没有指定,默认是.at_start()
)
fn main() {
App::new()
.add_plugins(DefaultPlugins)
// this will run at the start of CoreStage::Update (the default stage)
.add_system(do_crazy_things.exclusive_system())
// this will run at the end of CoreStage::PostUpdate
.add_system_to_stage(
CoreStage::PostUpdate,
some_more_things
.exclusive_system()
.at_end()
)
.run();
}