Enemies appear in scripted or procedural groups at intervals; surviving each wave is the primary challenge loop.
Space Invaders: a formation marches side to side, drops and reverses at the edges; clear the wave and a faster one spawns.
Paces the waves. Each timeout releases a group; clearing a wave (or the timer count) advances difficulty for the next.
$WaveTimer.timeout.connect(spawn_wave)
func spawn_wave():
for i in 5 + wave: spawn_one()
wave += 1The enemy prefab. Instantiate fresh copies per spawn so each foe lives independently of the spawner.
@export var enemy: PackedScene
func spawn_one():
var e = enemy.instantiate()
add_child(e)Spawn points placed around the arena. Pick one per enemy so waves arrive from varied positions rather than a single door.
var points = $Spawns.get_children()
e.global_position = points.pick_random().global_positionIn short: spawn_timer signals spawn of enemy group from Array; wave count increments after clear; difficulty scales per wave
30 catalogued game(s) use this mechanic, spanning 1984–1995.
▶ Explore Wave Spawning interactively — see every game + the Godot system