Latest commit a926cd8
ParamSet
出于安全原因,系统的参数不能出现数据竞争。例如,下面的例子会报错:
#![allow(unused)] fn main() { fn test( transforms_a: Query<&Transform, With<ComponentA>>, mut transforms_b: Query<&mut Transform, With<ComponentB>>, ) { // 就跟 Rust 的引用、借用规则一样 // 一个解决办法就是把 // Query<&mut Transform, With<ComponentB>> // 改成 // Query<&mut Transform, (With<ComponentB>, Without<ComponentA>)> } }
Bevy 提供的解决方案是 ParamSet:
#![allow(unused)] fn main() { fn 重设生命值( // 同时查询“敌人”和“玩家”的 `Health` 组件 mut set: ParamSet<( Query<&mut Health, With<Enemy>>, Query<&mut Health, With<Player>>, &World, )>, ) { // 设置“敌人”的生命值(用第一个参数 p0) for mut health in set.p0().iter_mut() { health.hp = 50.0; } // 设置“玩家”的生命值(用第二个参数 p1) for mut health in set.p1().iter_mut() { health.hp = 100.0; } // 从游戏世界获取一些数据(用第三个参数 p2) let my_resource = set.p2().resource::<MyResource>(); // 没有数据竞争! } }
最多可以有 8 个参数(p0、p1、p2、p3、p4、p5、p6、p7)。