Spawning & Waves

Two ways to fill a level β€” position-triggered placement and timed waves β€” plus formations and flight paths.

πŸ—ΊοΈPlacement + waves
⏱️12 min read
🐍Formations
〰️Spline paths
ASKScrollSpawner Β· ASKWaveDirector

ShmupKit has two ways to get enemies into a level, and they are meant to be mixed freely in the same stage. They share one spawn path, so an enemy configured by either arrives identically.

SystemTriggered byBest for
PlacementPosition β€” the terrain scrolling to a marker you dropped in the levelTerrain-tied units like turrets on an island, and hand-placed set pieces
WavesTime β€” a global clock running down a list of stepsTimed formations, endless streams, scripted attack sequences

Placement spawning

Drop a BP_ScrollSpawner into the level and add spawn points to it. The spawner attaches itself to the scrolling background on play, so its points ride in with the terrain β€” which is what makes position mean timing.

The spawner

PropertyDefaultPurpose
Attach To TerrainOnThe default for its points: ground units ride the island, air units fly free. Each point can override it.
Spawn Lead Distance200Units above the top edge at which enemies are created, so they scroll into view rather than popping in.
Add Spawn Pointβ€”A button in the Details panel that adds a point in one click.

A spawner needs a camera director and a scrolling background in the level, and warns if either is missing. Set the root Billboard's sprite to give it a recognisable icon in the viewport.

Spawn points

Each point is one enemy or one formation. Add several under a spawner and drag them into place.

PropertyPurpose
Enemy ClassRequired. What to spawn.
FormationOptional. Spawns a whole group in a shape instead of a single enemy.
PathOptional. The route the spawned enemies fly.
Mirror PathFlips that route horizontally, so one authored path serves both sides.
Group TagPoints sharing a tag all fire together when the leading one crosses the line, so an authored spread survives instead of trickling in.
Entry DepthSpawn this far below the top screen edge, anchored to the camera rather than the marker. 0 uses the marker's own position.
Attach To TerrainPer-point override: use the spawner's default, force attach, or force free flight.

Per-point overrides

Retune one placement without duplicating the enemy asset. Every override follows the same rule: 0 or None keeps the enemy's own value.

OverrideReplaces
Move Speed OverrideThe enemy's movement speed.
Health OverrideIts max health, for this spawn only.
Score Value OverridePoints awarded on death.
Weapon Data OverrideThe weapon fitted to its front mount.
Drop Table OverrideWhat it drops.

Three rules that matter

1. Position is timing. A point fires the moment it scrolls to the trigger line. Points spread along the scroll axis arrive in sequence; points at the same height arrive together as a cluster. There is no delay field β€” spacing is the timing.
2. Ride or fly, never both. An enemy either rides the terrain (attached, carried by the world) or flies a path under its own power. A path follower is never attached even with Attach To Terrain on, because being driven by both would double its speed and drag it off screen early.
3. Sideways flyers need Entry Depth. The camera is fixed along the scroll axis and only terrain moves through it, so an enemy flying sideways never changes its position along that axis β€” spawned at a terrain-riding marker it crosses the whole level just out of sight. Entry Depth anchors the spawn to the camera instead. Note that it sets the scroll-axis position outright, so tag-grouped members sharing one depth all land on the same line; their sideways spread is unaffected.

Editor visuals

Each spawn point draws a preview mesh of the enemy it will spawn, a facing arrow, and a floating label estimating how many seconds until it reaches the screen β€” so a level's pacing is readable in the viewport without pressing Play.

Wave spawning

Place an SKWaveDirector in the level and give it a list of wave assets. It runs them in order on a clock.

PropertyDefaultPurpose
Wavesβ€”The wave assets to run, in order.
Auto StartOnBegin on play. Turn it off to trigger waves yourself.
LoopOffRestart from the first wave after the last completes β€” an endless mode in one tick box.
Function / EventPurpose
Start Waves / Stop WavesManual control.
Jump To Wave / Jump To StepSkip directly to a point in the sequence. Useful for testing.
On Wave StartedFires with the wave index.
On Wave ClearedFires when every enemy from a wave is gone.
On All Waves CompleteFires at the end of the list β€” a natural place to spawn the boss.

Wave assets

A wave defines what to spawn, then lists the steps that spawn it.

PropertyPurpose
Enemy ClassWhat this wave spawns.
FormationOptional group shape for each step.
Path OverrideRoute for the spawned enemies.
Weapon Data Override / Drop Table OverrideWave-wide retuning, same 0-or-None rule as spawn points.
StepsThe spawn events that make up the wave.
Wait For ClearOn by default: the next wave waits until this one is wiped out. Off runs waves on the clock alone, overlapping them.
Post Wave DelaySeconds of breathing room after the wave ends.
Pre Warm PoolCreates the wave's actors up front, so a big first wave doesn't hitch as it spawns.

Steps

PropertyPurpose
DelaySeconds to wait after the previous step before this one fires. It is relative, not an absolute timestamp β€” so inserting a step shifts everything after it rather than requiring a rewrite.
Spawn OriginWhere this step spawns, in world space.
Spawn Facing YawWhich way the spawned enemies face.
Mirror PathFlips the route for this step only, so alternating steps sweep in from opposite sides.
Move Speed / Health / Score Value OverridePer-step retuning.

Formations

A formation spawns a group as one unit. Both spawn points and wave steps accept one.

TypeBehaviour
PointsA fixed shape. Each member has its own offset, an optional fire delay so the group doesn't volley in perfect unison, and an index used for per-member drops.
TrailFollow the leader β€” Trail Count members spaced Trail Spacing apart along the path.
PropertyPurpose
MembersPoints mode. Each entry is an offset, a fire delay and an index.
Member Spawn DelayPoints mode. Staggers the members' arrival instead of popping the whole shape in at once.
Trail Count / Trail SpacingTrail mode. How many follow, and how far apart.
Drop TableApplies to every member.
First Drop / Last DropTrail mode. Give the leader or the straggler a different reward β€” the classic "kill the whole snake" bonus.

Paths

A path is a list of waypoints an enemy flies. Assign one to a spawn point, a wave, or directly to an enemy's movement component with the Follow Path mode.

PropertyDefaultPurpose
Waypointsβ€”The route, in order.
Move Speed0Speed along the path. 0 uses the enemy's own speed.
Speed Curveβ€”Optional curve scaling speed along the route, for a swoop that accelerates through the middle.
SmoothOnCurves the route through the waypoints instead of turning sharp corners.
Orient To PathOnPoints the enemy along its direction of travel.
Rotate To Entry DirectionOffFaces the enemy along the path's opening direction as it spawns.

Authoring paths visually

Place an SKSplinePath actor, shape the spline in the viewport, and press Bake To Path Data to write it into a path asset. Point Spacing controls how finely the curve is sampled, and Load From Path Data brings an existing asset back onto the spline for editing.

Common fixes

  • Sideways flyers never appear β€” set Entry Depth so they spawn relative to the camera
  • A cluster trickles in one at a time β€” give the points a shared Group Tag
  • A ground unit slides off the island β€” it has a path assigned, so it flies instead of riding
  • Waves overlap unexpectedly β€” Wait For Clear is off
  • The first big wave hitches β€” tick Pre Warm Pool on it
  • Editing one step's delay shifts the whole wave β€” delays are relative by design; that is the intent

Where next

Enemies

Build the enemies these systems spawn.

Read β†’

Bosses

End a stage with a multi-phase fight.

Read β†’

Object Pooling

Pre-warming and reuse.

Read β†’