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],手动管理相关事件类型的生命周期。