标签
标签可以给你应用程序中的各种东西命名,比如系统(用于执行顺序控制)、执行条件、阶段和其它集合。
Bevy 使用了一些聪明的 Rust 类型系统魔法,允许你使用字符串和你自定义的类型作为标签,甚至可以将它们混合使用!
使用字符串做标签对于原型设计来说是既快速又简单。然而,它们很容易打错,而且是非结构化的。编译器不能帮助你验证它们以发现错误。
你也可以使用自定义类型(通常是枚举
)来定义你的标签。这使编译器可以检查它们,有助于你在较大的项目中保持标签的组织性。
你需要根据它们的用途,派生出适当的 trait:StageLabel
,SystemLabel
,RunCriteriaLabel
,或者 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 输入时也可以自动补全。这是推荐的方式,因为它可以防止错误,并帮助你在大型项目中保持组织性。