// This example shows how you can know when a `Component` has been removed, so you can react to it. use bevy::prelude::*; fn main() { // Information regarding removed `Component`s is discarded at the end of each frame, so you need // to react to the removal before the frame is over. // // Also, `Components` are removed via a `Command`. `Command`s are applied after a stage has // finished executing. So you need to react to the removal at some stage after the // `Component` is removed. // // With these constraints in mind we make sure to place the system that removes a `Component` on // the `CoreStage::Update' stage, and the system that reacts on the removal on the // `CoreStage::PostUpdate` stage. App::new() .add_plugins(DefaultPlugins) .add_startup_system(setup) .add_system_to_stage(CoreStage::Update, remove_component) .add_system_to_stage(CoreStage::PostUpdate, react_on_removal) .run(); } // This `Struct` is just used for convenience in this example. This is the `Component` we'll be // giving to the `Entity` so we have a `Component` to remove in `remove_component()`. #[derive(Component)] struct MyComponent; fn setup( mut commands: Commands, asset_server: Res, mut materials: ResMut>, ) { let texture = asset_server.load("branding/icon.png"); commands.spawn_bundle(OrthographicCameraBundle::new_2d()); commands .spawn_bundle(SpriteBundle { material: materials.add(texture.into()), ..Default::default() }) .insert(MyComponent); // Add the `Component`. } fn remove_component( time: Res