为什么我在 Bevy 中尝试更改检测从未触发?

Why does my attempt at Change Detection in Bevy never trigger?

我不确定我是否混淆了 Bevy 的变更检测系统的功能,或者我只是做错了。但是,在尝试检测更改时,我只会在生成组件时收到通知。

下面,我spawn一个Group,Size(2)的元组。然后,sizequery每帧运行,直到size为5。这一次,groupsize只有运行一次,size为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 &mut query.iter() {
        println!("GS-{}",s.0);
    }
}

fn sizequery(mut query: Query<&mut Size>) {
    for mut s in &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(&self, app: &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"

这是因为 sizequery 在 groupsize 之后似乎 运行。
我可能在那里错了,但我得到了你的代码 运行 我相信你的意图是什么。
我将您的插件更改为:

fn build(&self, app: &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

因此,您所写问题的答案是,读取更改的系统应设置为 运行 在进行更改的系统之后的阶段。