独占系统

独占系统是指 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();
    }