praca_magisterska/games/unreal/tutorial/part-5-create-spawner.md

4.2 KiB

Part 5: Create Enemy Spawner

← Previous: Part 4 - Create the Enemy | Back to Index | Next: Part 6 - Game Director →


Step 5.1: Create Spawner Blueprint

  1. Content Browser → Blueprints

  2. Right-click → Blueprint ClassActor

  3. Name: BP_EnemySpawner

  4. Double-click to open

  5. Create Variables:

Variable Name Type Default Value
EnemyClass Class Reference (will reference BP_Enemy)
SpawnAreaHalfWidth Float 900.0
GameDuration Float 300.0 (5 minutes)
MaxSimultaneousEnemies Integer 120
ElapsedTime Float 0.0
SpawnTimer Float 0.0
SpawningActive Boolean true

Expected Result after Compile

  • Compile button shows GREEN checkmark
  • Variables panel shows all 7 variables with correct types
  • No components needed (spawner is invisible logic actor)

Step 5.2: Spawn Rate Curve

1. Create Variable

  • SpawnCurve (Curve Float)

2. To create the curve asset

  1. In Content Browser, right-click → Miscellaneous → Curve
  2. Select "CurveFloat"
  3. Name it SpawnRateCurve
  4. Double-click to open Curve Editor

3. In Curve Editor

  • Right-click on the curve → Add Key
  • Create these keyframes:
Time Value Description
0.0 0.4 slow spawn at start
0.5 2.0 medium spawn halfway
1.0 4.5 fast spawn at end
  • The X axis is normalized time (0-1)
  • The Y axis is spawns per second

4. In BP_EnemySpawner, set SpawnCurve default to this curve asset

Expected Result in Curve Editor

  • Curve line visible starting at (0, 0.4), rising through (0.5, 2.0), ending at (1.0, 4.5)
  • Smooth interpolation between keyframes

Expected Result in Play mode

  • Game start: ~0.4 enemies spawn per second (slow)
  • At 2.5 minutes: ~2 enemies spawn per second (medium)
  • At 5 minutes: ~4.5 enemies spawn per second (intense)

Step 5.3: Spawning Logic

1. In Event Graph, from Event Tick

a) Check if SpawningActive is true

  • If false, do nothing

b) Update ElapsedTime

  • Add DeltaSeconds to ElapsedTime

c) Calculate normalized time

  • Divide ElapsedTime by GameDuration
  • Clamp between 0 and 1

d) Get spawn rate from curve

  • Get SpawnCurve
  • Call Get Float Value with normalized time
  • This returns spawns per second

e) Update SpawnTimer

  • Subtract DeltaSeconds from SpawnTimer
  • If SpawnTimer <= 0:
    • Reset SpawnTimer to (1.0 / SpawnsPerSecond)
    • Call SpawnWave function

2. CREATE "SpawnWave" FUNCTION

a) Inside

  • Calculate burst size based on time:

    BaseCount = 1 + (NormalizedTime * 6)
    BurstSize = BaseCount + Random(0, 2)
    Clamp between 1 and 12
    

b) For Loop from 0 to BurstSize - 1

  • Call SpawnEnemy function

3. CREATE "SpawnEnemy" FUNCTION

a) Inside

  • Check: Get All Actors of Class (BP_Enemy)
    • Get array length
    • If >= MaxSimultaneousEnemies: Return (don't spawn)

b) Calculate spawn position

  • X = Random Float in Range (-SpawnAreaHalfWidth, SpawnAreaHalfWidth)
  • Y = Get this actor's Y position (top of screen)
  • Z = 0

c) Spawn Actor from Class

  • Class: EnemyClass
  • Location: calculated position
  • Rotation: (0, 0, 0)

4. CREATE "StopSpawning" FUNCTION

  • Set SpawningActive = false

Expected Result after Compile

  • Compile button shows GREEN checkmark
  • "SpawnWave", "SpawnEnemy", "StopSpawning" functions appear under Functions

Expected Result in Play mode

  • Enemies spawn at top of screen (Y=500) at random X positions
  • Spawn rate increases over time following the curve
  • Maximum 120 enemies on screen at once
  • When StopSpawning called: No new enemies appear

← Previous: Part 4 - Create the Enemy | Back to Index | Next: Part 6 - Game Director →