#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
, то оно работает так, как ожидалось.