0

我有一个正在生成其他实体的实体。例如生成器有一个位置组件,我希望生成的实体与生成器具有相同的位置。

在生成系统中,似乎我需要读取和写入一个组件,这听起来不可能。唯一的选择似乎是 a LazyUpdate,但我想避免这种情况,因为它需要调用world::maintain,并且我想在同一框架内的另一个系统中使用生成的实体。

我的系统代码:

#[derive(Debug)]
struct Position {
    x: f32, // meters
    y: f32,
    z: f32,
    direction: f32,
}
impl Component for Position {
    type Storage = VecStorage<Self>;
}

struct GenerateEntity;
impl<'a> System<'a> for GenerateEntity {
    type SystemData = (
        ReadStorage<'a, Generator>,
        ReadStorage<'a, Position>,
        Entities<'a>,
    );

    fn run(&mut self, (gen, pos, entities): Self::SystemData) {
        for (pos, gen) in (&pos, &gen).join() {
            let generated = entities.create();
            // This gives an error because position can only be read
            pos.insert(generated, pos.clone());
        }
    }
}

我该如何解决这个问题?

4

1 回答 1

2

似乎我需要读写一个组件,这听起来不可能

当然是:使用WriteStorage.

这个名字有点误导。WriteStorage不是只写存储;它是可变存储,包括读取。

唯一的问题是您在迭代位置存储时可能无法插入位置存储。您需要存储在循环期间要进行的更改,然后再应用它们。

(正如评论指出的那样,您应该pos在循环中重命名(指的是单个组件),这样它就不会影响pos您作为参数(指的是整个存储))

于 2020-08-25T14:53:10.693 回答