标签

标签可以给你应用程序中的各种东西命名,比如系统(用于执行顺序控制)、执行条件阶段和其它集合。

Bevy 使用了一些聪明的 Rust 类型系统魔法,允许你使用字符串和你自定义的类型作为标签,甚至可以将它们混合使用!

使用字符串做标签对于原型设计来说是既快速又简单。然而,它们很容易打错,而且是非结构化的。编译器不能帮助你验证它们以发现错误。

你也可以使用自定义类型(通常是枚举)来定义你的标签。这使编译器可以检查它们,有助于你在较大的项目中保持标签的组织性。

你需要根据它们的用途,派生出适当的 trait:StageLabelSystemLabelRunCriteriaLabel,或者 AmbiguitySetLabel

任何 Rust 类型都是合适的,只要它满足这些标准的 Rust trait:Clone + Eq + Hash + Debug (以及隐含的 Send + Sync + 'static)。

    #[derive(Debug, Clone, PartialEq, Eq, Hash)]
    #[derive(SystemLabel)]
    enum MySystems {
        InputSet,
        Movement,
    }

    #[derive(Debug, Clone, PartialEq, Eq, Hash)]
    #[derive(StageLabel)]
    enum MyStages {
        Prepare,
        Cleanup,
    }

    #[derive(Debug, Clone, PartialEq, Eq, Hash)]
    #[derive(StageLabel)]
    struct DebugStage;

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

            // Add our game systems:
            .add_system_set(
                SystemSet::new()
                    .label(MySystems::InputSet)
                    .with_system(keyboard_input)
                    .with_system(gamepad_input)
            )
            .add_system(player_movement.label(MySystems::Movement))

            // temporary debug system, let's just use a string label
            .add_system(debug_movement.label("temp-debug"))

            // Add our custom stages:
            // note that Bevy's `CoreStage` is an enum just like ours!
            .add_stage_before(CoreStage::Update, MyStages::Prepare, SystemStage::parallel())
            .add_stage_after(CoreStage::Update, MyStages::Cleanup, SystemStage::parallel())

            .add_stage_after(CoreStage::Update, DebugStage, SystemStage::parallel())

            // we can just use a string for this one:
            .add_stage_before(CoreStage::PostUpdate, "temp-debug-hack", SystemStage::parallel())

            .run();
    }

对于快速原型设计,只用字符串作为标签是很方便的。

然而,通过将你的标签定义为自定义类型,Rust 编译器可以为你检查它们,你的 IDE 输入时也可以自动补全。这是推荐的方式,因为它可以防止错误,并帮助你在大型项目中保持组织性。