Latest commit 1d3f6e4

运行标准

运行标准是一种机制,控制 Bevy 在运行时运行特定系统。能够制作仅在特定条件下运行的功能。

运行标准是低级原语。Bevy在上层提供了高级抽象,比如[状态]。如果真的需要更直接的控制,可以用没有高级抽象的运行标准。

运行标准可以应用于各个系统、系统集和阶段。

运行标准是 Bevy 的系统,它返回一个类型为enum ShouldRun的值。运行标准就像像普通系统一样,接受任何系统参数。

这个例子展示了如何使用运行标准来实现不同的多人模式:

use bevy::ecs::schedule::ShouldRun;

#[derive(Debug, PartialEq, Eq)]
enum MultiplayerKind {
    Client,
    Host,
    Local,
}

fn run_if_connected(
    mode: Res<Multiplayerkind>,
    session: Res<MyNetworkSession>,
) -> ShouldRun
{
    if *mode == MultiplayerKind::Client && session.is_connected() {
        ShouldRun::Yes
    } else {
        ShouldRun::No
    }
}

fn run_if_host(
    mode: Res<MultiplayerKind>,
) -> ShouldRun
{
    if *mode == MultiplayerKind::Host || *mode == MultiplayerKind::Local {
        ShouldRun::Yes
    } else {
        ShouldRun::No
    }
}

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)

        // 如果我们当前连接到服务器,激活客户端系统
        .add_system_set(
            SystemSet::new()
                .with_run_criteria(run_if_connected)
                .before("input")
                .with_system(server_session)
                .with_system(fetch_server_updates)
        )

        // 如果我们是游戏主机,激活游戏主机系统
        .add_system_set(
            SystemSet::new()
                .with_run_criteria(run_if_host)
                .before("input")
                .with_system(host_session)
                .with_system(host_player_movement)
                .with_system(host_enemy_ai)
        )

        // 其他系统
        .add_system(smoke_particles)
        .add_system(water_animation)
        .add_system_set(
            SystemSet::new()
                .label("input")
                .with_system(keyboard_input)
                .with_system(gamepad_input)
        )
        .run();
}

已知的陷阱

多个运行标准

无法建立以多个运行条件为条件的系统。Bevy 有一个 .pipe 方法来“链接”运行条件,这可以能修改运行标准的输出,但这在实践中非常有限。

考虑使用 iyes_loopless,它允许你使用任意数量的运行条件来控制系统,并且不会阻止你使用状态或固定的时间间隔。

事件

如果某个接收事件的系统不是每帧运行,那么系统不运行时,会错过所有事件。避免这个陷阱的方法是实现 [Manual Event Clearing],手动管理相关事件类型的生命周期。