1个不稳定版本
| 新 1.0.0 |
|
|---|---|
| 0.1.0 | 2024年8月14日 |
#941 在 过程宏
198 每月下载量
在 bevy_previous 中使用
5KB
87 行
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: 启用 serde 的 Previous 实现 |
依赖关系
~265–710KB
~17K SLoC