Почему моя попытка обнаружения изменений в Bevy никогда не срабатывает?

#rust #bevy

#Ржавчина #bevy

Вопрос:

Я не уверен, не путаю ли я, что делают системы обнаружения изменений Bevy, или я просто делаю это неправильно. Но при попытках обнаружить изменения я получаю уведомление только при создании компонента.

Ниже я spawn привожу кортеж из Group,Size(2) . Затем sizequery выполняется каждый кадр до тех пор, пока размер не будет равен 5. За это время groupsize выполняется только один раз, размером 2. Почему это?

 use bevy:: {
    prelude::*,
};

fn main () {
    App::build()
        .add_resource(WindowDescriptor {
            ..Default::default()
        })
        .add_default_plugins()
        .add_startup_system(setup.system())
        .add_plugin(TestPlugin)
        .run();
}

struct Group;
struct Size(u32);

fn setup(mut commands: Commands) {
    commands.spawn((Group,Size(2)));
}

fn groupsize(mut query: Query<Changed<Size>>) {
    for s in amp;mut query.iter() {
        println!("GS-{}",s.0);
    }
}

fn sizequery(mut query: Query<amp;mut Size>) {
    for mut s in amp;mut query.iter() {
        if s.0 < 5 {
            s.0 = s.0 1;
            println!("add{}",s.0);
        }
    }
}

pub struct TestPlugin;

impl Plugin for TestPlugin {
    fn build(amp;self, app: amp;mut AppBuilder) {
        app.add_system(groupsize.system());
        app.add_system(sizequery.system());
    }
}
  

Cargo.toml:

 [package]
name = "bevy_test"
version = "0.1.0"
edition = "2018"

[dependencies]
bevy = "0.1.3"
  

Ответ №1:

Это потому, что sizequery кажется, что выполняется после groupsize.
Возможно, я ошибаюсь, но я получил ваш код для выполнения того, что, как я полагаю, является вашим намерением.
Я изменил ваш плагин на:

 fn build(amp;self, app: amp;mut AppBuilder) {
    app.add_system(groupsize.system())
        .add_system_to_stage(stage::FIRST, sizequery.system());
}
  

groupsize не будет печатать, GS-2 поскольку sizequery обновляет свое значение раньше, чем сможет.
Результат изменений:

 add3
GS-3
add4
GS-4
add5
GS-5
  

Итак, ответ на ваш письменный вопрос будет таким: системы, которые считывают изменения, должны быть настроены на этапы, которые выполняются после систем, которые вносят изменения.

Комментарии:

1. Это решает проблему под рукой. Я хочу добавить, что, похоже, это также работает, если изменен порядок добавления систем. Если sizequery добавлено раньше groupsize , то оно работает так, как ожидалось.