The Bevy Book - 2.5 资源Resources
作者:互联网
资源
实体和组件非常适合表示复杂的、可查询的数据组。但大多数应用程序还需要某种"globally unique"的数据。在 Bevy ECS 中,我们使用资源来表示全局唯一数据。
以下是一些可以写成Resources的数据示例:
- 已用时间 Elapsed Time
- 资源集合(声音、纹理、网格) Asset Collections
- 渲染器 Renderers
使用Resources跟踪时间
让我们解决应用程序的“hello spam”问题,每两秒钟只打印一次“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
指针分别提供对资源的读取和写入访问权限。
delta_seconds
上的Time
字段为我们提供了自上次更新以来经过的时间。但是,为了每两秒运行一次我们的系统,我们必须跟踪经过一系列更新的时间量。为了简化此操作,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 that caused the timer to finish, we say hello to everyone
if timer.0.tick(time.delta()).just_finished() {
for name in query.iter() {
println!("hello {}!", name.0);
}
}
}
现在剩下的就是将GreetTimer
资源添加到我们的HelloPlugin
:
impl Plugin for HelloPlugin {
fn build(&self, app: &mut App) {
// the reason we call from_seconds with the true flag is to make the timer repeat itself
app.insert_resource(GreetTimer(Timer::from_seconds(2.0, true)))
.add_startup_system(add_people)
.add_system(greet_people);
}
}
现在cargo run
应用程序。它现在应该以合理的速度向人们打招呼。
标签:Bevy,people,应用程序,add,Book,Resources,query,hello,资源 来源: https://www.cnblogs.com/riveruns/p/16323601.html