#component #previous #bevy #change-detection

bevy_previous

访问组件的先前值

1 个不稳定发布

1.0.1 2024年8月14日
0.1.0 2024年8月14日

#359游戏开发

Download history 281/week @ 2024-08-12

281 每月下载量

MIT 协议

15KB
106

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 0.1

bevy_previous的主分支与bevy的主分支保持同步。

关于PreviousPlugin::default()的说明

此功能仅适用于实现了 DefaultSchedule 特质的计划。这是标准 bevy 计划自动实现的,但对你自己的计划,你必须手动使用 derive(DefaultSchedule) 辅助宏实现 DefaultSchedule,或者使用 PreviousPlugin::new(schedule)

特性标志

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

依赖

~23MB
~427K SLoC