1 个不稳定发布
新 1.0.1 |
|
---|---|
0.1.0 | 2024年8月14日 |
#359 在 游戏开发
281 每月下载量
15KB
106 行
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: 启用 serde 对 Previous 的实现 |
依赖
~23MB
~427K SLoC