系统链

可参考的官方例子: system_chaining.


你可以用多个 Rust 函数组成一个 Bevy 系统

可以编写一些仅接受一个输入参数并返回一个输出参数的函数,并把它们连接在一起,作为一个更大的系统运行。

这被称为"系统链",但要注意"链"这个术语有些误导性--你不是在创建一个由多个系统组成的链式系统来依次运行,而是在创建一个由多个 Rust 函数组成的单一的大型 Bevy 系统。

请注意,系统链并不是在系统之间进行通信的一种方式。如果你想在系统之间传递数据,你应该使用事件来代替。


一个有用的场景是从系统代码中返回错误(允许使用 Rust 的 ? 操作符),然后由一个单独的函数来处理这些错误。

    fn net_receive(mut netcode: ResMut<MyNetProto>) -> std::io::Result<()> {
        netcode.receive_updates()?;

        Ok(())
    }

    fn handle_io_errors(In(result): In<std::io::Result<()>>) {
        if let Err(e) = result {
            eprintln!("I/O error occurred: {}", e);
        }
    }

这样的函数不能单独地注册为系统(Bevy 不知道该如何处理它的输入/输出)。你必须把它和系统链在一起:

    fn main() {
        App::new()
            // ...
            .add_system(net_receive.chain(handle_io_errors))
            // ...
            .run();
    }

性能警告

请注意,Bevy 把整个系统链当作一个单一的大系统来处理,所有的资源和查询都是合并的。这意味着并行性可能受到限制,影响性能。

避免添加一个需要对任何东西进行可变访问的系统作为多个链的一部分,它将阻止所有受影响的链(以及其它访问相同数据的系统)的并行运行。