实体(Entities) 和 组件(Components) 非常合适表示复杂的, 可查询的数据组. 但是大多数应用还是需要某种全局唯一
数据. 在Bevy ECS中, 我们使用 资源(Resources) 来表示全局唯一数据.
这儿有一些可以被当做Resources的数据例子:
让我们通过每2秒钟打印一次hello
来解决应用的垃圾信息问题. 我们将通过Time
资源来完成它. 该资源通过add_plugins(DefaultPlugins)
自动添加到我们的应用中.
简单点, 从应用中删除hello_world
系统. 这样我们只需要适配greet_people
系统.
访问资源的方式与访问组件的方式基本相同. 你可以在你的系统中像这样访问Time
资源:
fn greet_people(time: Res<Time>, query: Query<&Name, With<Person>>) {
for name in query.iter() {
println!("hello {}!", name.0);
}
}
Res
和ResMut
指针分别提供对资源的读写.
Time
的delta_seconds
字段给我们提供了上一次更新以来所经过的时间. 但是为了每2秒钟运行一次系统(system), 我们必须跟踪经过的一系列更新的时间. 为了简化过程, Bevy提供了Timer
类型. 让我们创建一个新的资源(Timer
), 来追踪经过的时间.
struct GreetTimer(Timer);
fn greet_people(
time: Res<Time>, mut timer: ResMut<GreetTimer>, query: Query<&Name, With<Person>>) {
// update our timer with the time elapsed since the last update
// if the timer hasn't finished yet, we return
if !timer.0.tick(time.delta_seconds()).just_finished() {
return;
}
for name in query.iter() {
println!("hello {}!", name.0);
}
}
现在剩下的就是把GreetTimer
这个资源添加到我们的HelloPlugin
中:
impl Plugin for HelloPlugin {
fn build(&self, app: &mut AppBuilder) {
// the reason we call from_seconds with the true flag is to make the timer repeat itself
app.add_resource(GreetTimer(Timer::from_seconds(2.0, true)))
.add_startup_system(add_people.system())
.add_system(greet_people.system());
}
}
现在, cargo run
这个App, 它将以比较合理的方式向人们打招呼.