Latest commit d7a897d

Removal Detection

相关的官方文档:[removal_detection]


删除检测不同于变化检测。如果删除了数据,ECS 就不再拥有这些数据,也就不能继续追踪它们了。

但是删除检测对于某些应用程序很重要,因此 Bevy 提供了有限的形式。

组件

todo:看得不明不白、未测试,等 Bevy 改进吧。

#[derive(Component)]
struct Seen;

fn main() {
    App::new()
        .add_plugins(DefaultPlugins)
        // 把系统添加到 PreUpdate 阶段
        .add_system_to_stage(CoreStage::PreUpdate, remove_components)
        // 用来检测的系统会在 PreUpdate 之后的阶段(Update)运行
        .add_system(detect_removals)
        .run();
}

fn removal_components(
    mut commands: Commands,
    q: Query<(Entity, &Transform), With<Seen>>,
) {
    for (e, transform) in q.iter() {
        if transform.translation.y < -10.0 {
            // 删除 Seen 组件
            commands
                .entity(e)
                .remove::<Seen>();
        }
    }
}

fn detect_removals (
    removals: RemovedComponents<Seen>,
    // ...(todo:不懂)...
) {
    for entity in removals.iter() {
        // 做一些事
        // 可以用 Commands::entity() 或 Query::get()
    }
}

资源

略。Bevy 不提供?那就不看了。