其他分享
首页 > 其他分享> > The Bevy Book - 2.5 资源Resources

The Bevy Book - 2.5 资源Resources

作者:互联网

资源

实体组件非常适合表示复杂的、可查询的数据组。但大多数应用程序还需要某种"globally unique"的数据。在 Bevy ECS 中,我们使用资源来表示全局唯一数据

以下是一些可以写成Resources的数据示例

使用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);
    }
}

ResResMut指针分别提供对资源的读取和写入访问权限。

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