我正在和 Bevy 一起制作一个小机器人玩具,每个机器人的速度/加速度取决于它周围的机器人的位置和速度值。这意味着对于每个 boid,我想运行一些依赖于其他 boid 的某个子集的逻辑。
这似乎基本上是一个嵌套的for循环:
for boid in boids {
for other_boid in boids {
if boid.id == other_boid.id {
continue;
}
if boid.position.distance_to(other_boid.position) < PERCEPTION_DISTANCE {
// change boid's velocity / acceleration
}
}
}
但是,我不确定如何使用 Bevy 中的查询来执行此操作。假设我有一个系统move_boids
:
fn move_boids(mut query: Query<&Boid>) {
for boid in &mut query.iter() {
// I can't iterate over *other* boids here
}
}
我收到类似这样的错误,因为我query
在两个循环中都在可变地借用:
error[E0499]: cannot borrow `query` as mutable more than once at a time
--> src\main.rs:10:32
|
10 | for boid in &mut query.iter() {
| ------------
| | |
| | ... and the first borrow might be used here, when that temporary is dropped and runs the `Drop` code for type `bevy::bevy_ecs::system::query::QueryBorrow`
| first mutable borrow occurs here
| a temporary with access to the first borrow is created here ...
...
11 | for other_boid in &mut query.iter() {}
| ^^^^^ second mutable borrow occurs here
我不能对同一个查询进行嵌套迭代,所以我不确定获取每个 boid 周围 boid 信息的最佳方法。我应该将每个 boid 的位置和速度信息从第一个查询复制到 aHashMap<Entity, BoidData>
中,然后在其中进行查找吗?还有什么更惯用的我可以做的吗?