Latest commit 7989cb2

检测组件的变化。

use bevy::prelude::*;
use rand::Rng;

fn main() {
    let mut app = App::new();
    app.add_plugins(DefaultPlugins);
    app.add_startup_system(初始设置);
    app.add_system(修改组件);
    app.add_system(变化检测);
    app.add_system(变化追踪);
    app.run();
}

#[derive(Component, Debug)]
struct MyComponent(f32);

fn 初始设置(mut commands: Commands) {
    commands.spawn(MyComponent(0.0));
    commands.spawn(Transform::IDENTITY);
}

fn 修改组件(time: Res<Time>, mut query: Query<(Entity, &mut MyComponent)>) {
    for (entity, mut component) in &mut query {
        if rand::thread_rng().gen_bool(0.1) {
            info!("正在修改实体: {:?}", entity);
            component.0 = time.elapsed_seconds();
        }
    }
}

// 这是查询过滤器,只有满足条件才能查询到实体
fn 变化检测(query: Query<(Entity, &MyComponent), Changed<MyComponent>>) {
    for (entity, component) in &query {
        info!("实体 {:?} 修改了组件: {:?}", entity, component);
    }
}

// 不设置过滤条件
fn 变化追踪(
    query: Query<(
        Entity,
        Option<&MyComponent>,
        Option<ChangeTrackers<MyComponent>>,
    )>,
) {
    for (entity, component, trackers) in &query {
        info!("{:?}: {:?}: -> {:?}", entity, component, trackers);
    }
}