1个不稳定版本

1.0.0 2024年8月14日
0.1.0 2024年8月14日

#941过程宏

Download history 198/week @ 2024-08-12

198 每月下载量
bevy_previous 中使用

MIT 许可证

5KB
87

Crates.io Size GitHub Issues or Pull Requests MIT License Bevy 0.14

bevy_previous

一个简单的库,用于 bevy 访问组件的先前值。

示例

假设一个由拥有 struct Health(pub u32) 组件的敌人组成的游戏。每当敌人被击中时,应该显示一个文本,显示他们失去的健康量。

为此,我们可以使用bevy的更改检测,但是为了显示健康量的差异,我们还需要之前的健康值。这就是 bevy_previous 发挥作用的地方。

struct Health(pub u32);

fn main() {
    App::new()
        .add_plugins(PreviousPlugin::<Health>::default())
        .add_systems(Update, print_differences)
        .run();
}

fn print_differences(query: Query<(&Health, &Previous<Health>), Changed<Health>>) {
    for (health, previous_health) in &query {
        println!("Health reduced by {}", previous_health - health);
    }
}

深入了解

PreviousPlugin::<T> 注册以激活组件 T 的先前值。请注意,默认情况下,更改将在 Last 调度中更新。您也不需要手动添加 Previous<T> 组件,这是在 Last 调度中自动完成的。这也意味着 Query<(&T, &Previous<T>)> 不会匹配刚刚创建的 T 实体。

如果您想自定义在 Previous<T> 被设置为 T 的情况,您可以将它作为第二个类型参数传递给 PreviousPlugin 以及 Previous,如下所示。

struct Health(pub u32);

fn main() {
    App::new()
        .add_plugins(PreviousPlugin::<Health, FixedLast>::default())
        .add_systems(FixedUpdate, print_differences)
        .run();
}

fn print_differences(query: Query<(&Health, &Previous<Health, FixedLast>), Changed<Health>>) {
    for (health, previous_health) in &query {
        println!("Health reduced by {}", previous_health.0.0 - health.0);
    }
}

唯一重要的是,Previous 在您的游戏逻辑之后更新。

由于这个特定的使用案例与 FixedMain 很常见,因此存在相应的类型别名: FixedPreviousPlugin<T>FixedPrevious<T>。如果您有自定义的调度,考虑为那些也添加类型别名。

兼容性

bevy bevy_previous
0.14 1.0.1

此外,bevy_previous 的主分支与 bevy 的主分支保持更新。

关于 PreviousPlugin::default() 的说明

这仅适用于实现了 DefaultSchedule 特性的调度。这是标准 bevy 调度自动实现的,但对于您自己的调度,您必须手动使用 derive(DefaultSchedule) 辅助宏实现 DefaultSchedule,或者使用 PreviousPlugin::new(schedule)

功能标志

标志 描述
derive default: 启用 DefaultSchedule 的 derive 宏
serde default: 启用 serdePrevious 实现

依赖关系

~265–710KB
~17K SLoC