//! This example illustrates how to use the `apply_system_buffers` system //! to flush commands added by systems that have already run, //! but have not had their buffers applied yet. //! //! This is useful when you don't want to wait until the next flush set //! automatically added by Bevy (usually `CoreSet::UpdateFlush`, for systems //! added to `CoreSet::Update`) but want to flush commands immediately. //! //! It is important that systems are ordered correctly with respect to //! `apply_system_buffers`, to avoid surprising non-deterministic system execution order. use bevy::prelude::*; fn main() { App::new() .add_plugins(DefaultPlugins) .init_resource::() .add_systems(Startup, setup) .add_systems( Update, ( ( despawn_old_and_spawn_new_fruits, // We encourage adding apply_system_buffers to a custom set // to improve diagnostics. This is optional, but useful when debugging! apply_system_buffers.in_set(CustomFlush), count_apple, ) .chain(), count_orange, bevy::window::close_on_esc, ), ) .run(); } #[derive(Resource)] struct Timers { repeating: Timer, } impl Default for Timers { fn default() -> Self { Self { repeating: Timer::from_seconds(0.5, TimerMode::Repeating), } } } #[derive(Debug, Hash, PartialEq, Eq, Clone, SystemSet)] struct CustomFlush; #[derive(Component)] struct Apple; #[derive(Component)] struct Orange; #[derive(Component)] struct AppleCount; #[derive(Component)] struct OrangeCount; // Setup the counters in the UI. fn setup(mut commands: Commands) { commands.spawn(Camera2dBundle::default()); commands .spawn(NodeBundle { style: Style { size: Size::new(Val::Percent(100.0), Val::Percent(100.0)), align_items: AlignItems::Center, justify_content: JustifyContent::Center, flex_direction: FlexDirection::Column, ..default() }, ..default() }) .with_children(|parent| { parent.spawn(( TextBundle::from_section( "Apple: nothing counted yet".to_string(), TextStyle { font_size: 80.0, color: Color::ORANGE, ..default() }, ), AppleCount, )); parent.spawn(( TextBundle::from_section( "Orange: nothing counted yet".to_string(), TextStyle { font_size: 80.0, color: Color::ORANGE, ..default() }, ), OrangeCount, )); }); } // Every tick, before the CustomFlush we added, we despawn any Apple and Orange // we have previously spawned, if any. Then we tick the timer, and if the timer // has finished during this tick, we spawn a new Apple and a new Orange. // // The commands that we have added here will normally be flushed by Bevy // as part of the `CoreSet::UpdateFlush` set, but because we have ordered // this system to run before `apply_system_buffer.in_set(CustomFlush)`, // these commands added here will be flushed during our custom flush. fn despawn_old_and_spawn_new_fruits( mut commands: Commands, time: Res