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)。