본 캠프 TIL

26.06.26 TIL / 과제 5-1 필수 구현 기능 완성

jh009 2026. 6. 26. 20:25

오늘

과제 필수 구현 기능

 

5-1. 멀티 웨이브 및 레벨 시스템 구축


GameMode 생성

Tools → New C++ Class → GameMode 선택 → 이름 설정 (MyGameMode)

 

MyGameMode.h

 

MyGameMode.cpp


BP_MyGameMode 생성

빌드 후, MyGameMode → Create Blueprint class based on MyGameMode → BP_MyGameMode 생성


BP_MyGameMode → Details 창에서 Wave 검색 후 설정

 

Wave Settings: 배열에 + 눌러 3개를 만들기

 

Duration : 각 Wave마다 제한 시간

SpawnCount : 아이템 스폰 횟수

 

Index 0: Wave 1  

Index 1: Wave 2  

Index 2: Wave 3   


SpawnVolume 생성

Tools → New C++ Class → Actor 선택 → 이름 설정 (SpawnVolume)

 

SpawnVolume.h

 

SpawnVolume.cpp


MyGameMode.cpp 수정


SpawnVolume 스폰 영역 설정


ItemBase 생성

Tools → New C++ Class → Actor 선택 → 이름 설정 (ItemBase)

 

ItemBase.h

 

ItemBase.cpp


BP_Bomb / BP_Potion 생성

ItemBase 우클릭 → Create Blueprint class based on ItemBase 

2개 생성하여 각각 BP_Bomb / BP_Potion 으로 만들고 Static Mesh 넣기

 

Static Mesh 설정


아이템 블루프린트 설정 확인

Collision Comp

Collision Presets → OverlapAllDynamic 인지 확인


GameMode에서 Item 연결

BP_MyGameMode → Details 패널 Wave System

Bomb Class / Potion Class 에 각각 BP_Bomb / BP_Potion 넣기


PIE 테스트

“Wave 1 시작!” 알림을 출력

SpawnVolume 박스 안에서 아이템이 랜덤 생성

 

Wave 2 시작!, Wave 3 시작!, 레벨 클리어! 까지 잘 뜨는 모습


레벨 전환

UGameplayStatics::OpenLevel 함수 사용

레벨 이름만 인자로 넘기기 → 자동으로 맵이 바뀜

새로 바뀐 맵에서도 동일한 MyGameMode 로직이 돌아가게 

 

MyGameMode.cpp 수정


모든 레벨에 동일한 GameMode를 설정

나머지 레벨 Level_2_Map, Level_3_Map 설정


PIE 테스트

Wave 와 Level 이 진행되는지 확인하기 위해 Wave 시간을 2초로 잠시 수정하였음


마지막 레벨인 Level_3_Map 클리어를 했을 때, 

"레벨 클리어! 다음 레벨로 진입합니다." 와 "★ 모든 레벨 클리어 ★" 가 같이 뜨는 문제를 수정


문제점

5-1. 멀티 웨이브 및 레벨 시스템 구축 구현은 됐지만, 현재 GameMode 하나에서 전부 다 처리하고 있음.

구현해야 될 것이 많지 않아서 괜찮지만, 프로젝트가 커진다면 GameMode 가 스파게티 코드가 될 수도 있음

 

GameState 을 따로 추가하여 역할을 분리 시키고 코드를 더 깔끔하게 쓰는 것이 낫다고 봄

 

AMyGameState 클래스 추가

  • CurrentWaveIndex, WaveSettings을 GameState가 관리하게 코드 수정 
  • GameMode → GameState 다음 웨이브로 넘어가라고 명령을 해주고,
  • GameState가 Wave Index를 올려서 상태 업데이트하게끔 코드 수정

회고

과제 5-1. 멀티 웨이브 및 레벨 시스템 구축을 하였다.

GameMode , SpawnVolume, ItemBase를 만들어 코드를 짜고 폭탄과 포션 메쉬도 넣으며 진행하였는데,

문제점이 있어서 따로 기재하였다.

 

주말동안 해야될 것

확장성과 가독성을 GameState을 추가하여 높이기

→ GameState에 데이터가 있으니 5-2를 진행할 때 (UI 추가), GetGameState<AMyGameState>() 이것만 호출한다면

현재 Wave와 시간을 쉽게 띄울 수 있을 것이다.

 

주말동안 컨디션 관리를 하는 것도 좋지만, 할 일을 하면서 쉬는 것이 더 중요하다고 본다.