공부 노트

2026년 8월 11일

insight05247 2026. 8. 11. 20:15

[Unreal Engine 기초반] 10강 — GameState와 몬스터 자동 스폰 구현

오늘은 Unreal Engine 기초반 10강을 진행했습니다.

9강에서는 GameMode를 중심으로 게임의 판정과 패배 흐름을 구현했다면, 이번 10강에서는 여기에 GameState를 추가하여 게임의 상태를 관리하고, SpawnVolume을 활용해 몬스터가 자동으로 스폰되는 구조를 학습했습니다.


1. 9강 복습 — GameMode와 Notify 구조

9강에서는 GameMode를 게임의 심판 역할로 사용했습니다.

게임의 규칙이나 판정을 담당하고, 필요한 상황이 발생하면 Notify~ 함수를 통해 다른 시스템에 상황을 전달하는 구조였습니다.

이번 강의에서는 이 구조에 GameState라는 점수판을 추가했습니다.

  • GameMode → 게임의 판정 및 규칙 담당
  • GameState → 현재 게임 상태를 저장하고 공유
  • HUD → GameState 등의 정보를 화면에 표시

즉, 게임의 판정을 담당하는 부분과 모두가 확인할 수 있는 상태 정보를 분리하는 방식입니다.


2. AMainGameState — 게임 상태 관리

이번 강의에서는 AMainGameState를 만들어 게임의 상태를 관리하도록 구성했습니다.

특히 GameMode에서 직접 모든 상태를 관리하는 것이 아니라, 플레이어들에게 공유되어야 하는 정보는 GameState에서 관리하도록 구조를 분리했습니다.

또한 다음과 같이 GetGameState<T>()를 활용하여 현재 GameState를 가져오는 방법도 학습했습니다.

AMainGameState* GS = GetGameState<AMainGameState>();

이를 통해 GameMode에서 GameState에 접근하여 게임 상태를 변경하거나 확인할 수 있습니다.


3. ASpawnVolume — 몬스터 자동 스폰

이번 강의에서 가장 핵심적으로 구현한 부분은 몬스터 자동 스폰 시스템입니다.

ASpawnVolume을 생성하고, 지정된 박스 영역 안에서 몬스터가 랜덤한 위치에 생성되도록 구현했습니다.

단순히 Volume 내부의 아무 위치에서 생성하는 것이 아니라 NavMesh 위의 위치를 찾아 스폰하도록 구성했습니다.

또한 타이머를 사용하여 일정 시간마다 몬스터가 자동으로 생성되도록 만들었습니다.

스폰 과정

SpawnVolume
    ↓
랜덤 위치 탐색
    ↓
NavMesh 위의 위치인지 확인
    ↓
몬스터 Spawn
    ↓
NotifyMonsterSpawned()

이를 통해 GameMap에 몬스터를 직접 배치하지 않아도 게임이 시작되면 자동으로 몬스터가 생성되도록 만들었습니다.


4. NotifyMonsterSpawned() 첫 호출

9강에서 만들어 두었지만 아직 실제로 호출되지 않았던

NotifyMonsterSpawned()

함수를 이번 강의에서 처음으로 사용했습니다.

몬스터가 스폰되면 GameMode에 해당 사실을 전달하고, 이를 통해 MonstersAlive와 같은 몬스터 생존 수를 관리할 수 있는 기반을 만들었습니다.

이번 강의부터는 이전까지 단순히 만들어져 있던 몬스터 생존 카운트가 실제 스폰과 연결되어 움직이기 시작했습니다.


5. 배치된 몬스터 제거

기존에는 GameMap에 몬스터를 직접 배치해 놓고 테스트했습니다.

하지만 이번 강의에서는 이러한 방식을 제거하고, 모든 몬스터를 SpawnVolume을 통해 생성하도록 변경했습니다.

기존 방식:

GameMap
 ├─ Monster
 ├─ Monster
 └─ Monster

변경 후:

GameMap
 └─ SpawnVolume
       ↓
    Monster Spawn

이제 맵에 몬스터를 직접 배치하지 않아도 Volume이 자동으로 몬스터를 생성하게 되었습니다.


6. 구현 중 발생한 오류

이번 강의를 진행하면서 몇 가지 오류가 발생했고, 원인을 직접 찾아 수정했습니다.

문제 1. 원거리 몬스터가 움직이거나 공격하지 않는 문제

근거리 몬스터는 정상적으로 스폰되고 이동 및 공격까지 정상적으로 동작했습니다.

하지만 원거리 몬스터는 스폰 자체는 정상적으로 되었지만 움직이지 않고 공격도 하지 않는 문제가 발생했습니다.

처음에는 스폰 과정이나 AI 로직에 문제가 있다고 생각했지만, 원인을 확인해 보니 AI Controller의 자동 빙의 설정이 잘못되어 있었습니다.

기존 설정

Auto Possess AI

Placed in World

이 설정은 맵에 직접 배치된 AI를 대상으로 하는 설정이었습니다.

이번에는 몬스터를 SpawnVolume에서 런타임에 생성하고 있기 때문에 이 설정으로는 정상적으로 AI가 빙의되지 않았습니다.

수정

Placed in World
        ↓
Placed in World or Spawned

Placed in World or Spawned로 변경한 후 원거리 몬스터도 정상적으로 AI Controller가 빙의되었고,

  • 이동
  • AI 행동
  • 공격

까지 정상적으로 동작하는 것을 확인했습니다.

배운 점

이번 문제를 통해 AI를 맵에 배치하는 것과 런타임에 Spawn하는 것은 다르게 처리될 수 있다는 점을 알게 되었습니다.

특히 Spawn되는 AI를 사용할 경우 Auto Possess AI 설정을 확인해야 한다는 것을 배웠습니다.


7. 문제 2. YOU DIED가 출력되지 않는 문제

두 번째 문제는 패배 화면이 출력되지 않는 문제였습니다.

BP 게임모드를 새로 만들어 Default GameMode로 설정한 후 테스트했는데,

플레이어의 체력 감소와 사망 판정은 정상적으로 작동했지만,

기존에 정상적으로 출력되던

YOU DIED

화면이 나타나지 않았습니다.

처음에는 HP 처리나 사망 로직에 문제가 있다고 생각했지만, 실제 원인은 GameMode의 상속 관계였습니다.

새로 만든 BP GameMode가 기존에 구현해 둔 AMainGameMode를 부모 클래스로 사용하지 않고 있었기 때문에, 기존의 패배 흐름을 전달받지 못하고 있었습니다.

기존

BP GameMode
    └─ 기본 GameMode

수정

BP GameMode
    └─ AMainGameMode
          └─ 기존 패배 처리

BP GameMode의 Parent Class를 Main Game Mode로 변경한 후 테스트했고,

정상적으로 YOU DIED 화면이 출력되는 것을 확인했습니다.

배운 점

이번 문제를 통해 Unreal Engine에서 Blueprint의 Parent Class가 매우 중요하다는 것을 다시 한번 확인했습니다.

기존 C++ 클래스에서 구현한 기능을 Blueprint에서도 사용하려면 올바른 부모 클래스를 상속받아야 합니다.

 

 

'공부 노트' 카테고리의 다른 글

2026년 8월 13일  (0) 2026.08.13
2026년 8월 12일  (0) 2026.08.12
2026년 8월 10일  (0) 2026.08.10
2026년 8월 7일  (0) 2026.08.07
2026년 8월6일  (0) 2026.08.06