实体(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, 它将以比较合理的方式向人们打招呼.