【问题标题】:Why does my attempt at Change Detection in Bevy never trigger?为什么我在 Bevy 中进行变更检测的尝试从未触发?
【发布时间】:2020-09-10 05:21:31
【问题描述】:

我不确定我是否混淆了 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"

【问题讨论】:

    标签: rust bevy


    【解决方案1】:

    这是因为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
    

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

    【讨论】:

    • 这解决了手头的问题。我想补充一下,如果更改系统的添加顺序,它似乎也可以工作。如果在groupsize 之前添加sizequery,那么它会按预期工作。
    猜你喜欢
    • 2021-01-17
    • 2014-09-02
    • 1970-01-01
    • 2012-03-19
    • 2021-09-02
    • 2020-04-02
    • 2021-05-15
    • 2014-06-02
    • 2022-06-14
    相关资源
    最近更新 更多