--- name: bevy-game-loop-waves description: "Bevy ECS skill for encounter waves. Keywords: Bevy, waves, spawn, encounter, ECS." --- # Bevy wave loop ## When to use Load this when enemies arrive in waves and the wave index advances after a clear. ## ECS shape - **Components:** a wave index and a remaining-count you define. - **Resources:** run-wide tables live in a resource (bevy-data-resources). - **Systems:** mutate those components on `Update` or the fixed timestep. Use `.chain()` when damage must land before death. - **Messages:** one-shot facts (hit, pickup, quest advance) go through bevy-events-messaging. Wave advance below is a resource, not a new message type. ## Examples ```toml [dependencies] bevy = "0.20" ``` The wave index and the spawn budget are one resource. Each enemy is an entity. Spawning and clearing share `WaveDirector`, so those systems are chained. ```rust #[derive(Resource)] struct WaveDirector { index: u32, budget: u32, intermission: f32, } #[derive(Component)] struct Enemy; fn boot(mut commands: Commands) { commands.insert_resource(WaveDirector { index: 1, budget: 4, intermission: 0.0, }); } fn spawn_budget(mut commands: Commands, mut wave: ResMut) { if wave.intermission > 0.0 || wave.budget == 0 { return; } for _ in 0..wave.budget { commands.spawn(Enemy); } wave.budget = 0; } fn advance_on_clear( enemies: Query<(), With>, mut wave: ResMut, time: Res