为什么我在Bevy中进行变更检测的尝试永远不会触发?

问题描述

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

下面,我spawnGroup,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 &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"

解决方法

这是因为SELECT name,status,COUNT(date) as partial_count,SUM(COUNT(date)) OVER (PARTITION BY name) as full_count FROM ( SELECT name,date FROM dbo.table1 WHERE status IN ('A','B','C') UNION ALL SELECT name,date FROM dbo.table2 WHERE status IN ('A','C') ) t GROUP BY name,status ORDER BY name,status; 似乎在分组大小之后运行。
我在这里可能是错的,但是我得到了您的代码以达到我认为是您的意图。
我将您的插件更改为:

sizequery

fn build(&self,app: &mut AppBuilder) { app.add_system(groupsize.system()) .add_system_to_stage(stage::FIRST,sizequery.system()); } 将不会打印groupsize,因为GS-2会先更新其值。 更改的输出:

sizequery

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