언리얼 엔진/프로젝트

[언리얼 엔진] 팀 프로젝트 제작 일기 01 - Game Flow 와 Room 시스템 구현

dhlee-dev 2026. 5. 7. 22:15

이번 팀 프로젝트에서 나는 Game Flow와 전투 시스템을 담당했다.
먼저 전체적인 게임 진행 흐름을 잡아야 전투 시스템도 자연스럽게 연결할 수 있다고 생각했다.

그래서 메인메뉴, 인게임, 결과창으로 이어지는 Game Flow를 먼저 구현하고,
인게임 내부에서는 방 단위로 진행되는 구조를 만들었다.

내가 작성한 코드에서
GameMode는 게임의 규칙, 전체적인 게임 관리를 담당하고,
GameStateUI나 플레이어에게 알려야 하는 정보들을 관리한다.
각각의 Room은 별도의 동작을 수행하고, GameMode, GameState 를 연동하여 전체적인 흐름을 관리했다.


RoomBase

이번 프로젝트는 플레이어가 전투방, 보물방 같은 특정 방에 진입하여 게임을 진행하는 형태이다.
따라서 모든 방의 공통 부모 역할을 하는 RoomBase 클래스를 만들었다.

위 이미지는 RoomBase에서 관리하는 주요 변수들이다.
RoomID, RoomType, NextRooms, bStarted, bCleared, bLocked 등을 통해
방의 ID, 타입, 다음 방 연결, 시작 여부, 클리어 여부, 잠금 상태를 관리하도록 했다.

여기서 중요한 건 파생된 함수들에서 실제 처리를 작성할 OnStart, OnEnd 가상 함수 이다.

중복되는 처리는 부모 클래스인 RoomBase에서 담당하고,
방마다 달라지는 동작은 OnStart, OnEnd를 오버라이드해서 처리하도록 했다.
이후에 방 시작 사운드나 공통 연출 같은 기능을 추가하더라도 중복 코드를 줄일 수 있을 것이라 생각해서 이런 구조를 선택했다.

NextRooms는 에디터에서 연결할 다음 방을 선택하도록 UPROPERTY 를 사용해서 열어놨다.
나중에 레벨 디자인을 할 때 좀 더 편리하게 할 수 있을 것이라 생각하여 이렇게 구현해보았다.


SafeRoom

이 게임은 총 3개의 층으로 구성되어있고, 각 층의 첫 번째 방은 휴식/정비방이다.
휴식방은 전투 외에 별도의 종료 조건을 걸어야했는데, 나는 ExitTriggerBox 를 만들고
해당 트리거 박스와 접촉 시 휴식방을 종료하는 방식으로 구현했다.

나중에 탈출구나, 출입문에 해당 트리거 박스를 설치하면 자연스럽게 방을 이동하면서
휴식방을 빠져나갈 수 있을 것이라 생각하여 이렇게 구현했다.

사진과 같이 Overlap Event 를 이용해서 처리했다.
이전에 현재 방이 휴식방인지 체크를 안했더니 휴식방을 지나갔음에도 ExitTrigger 충돌이 발생하는 문제가 있어서
현재 방인지 체크하는 조건을 걸어서 해당 문제를 해결했다.


CombatRoom

사진은 CombatRoom의 변수와 함수이다.
CombatRoom은 생성할 적 클래스와 스폰 포인트를 가지고 있고, 방이 시작될 때 실제 적 스폰을 담당한다.

전투방에서는 적이 모두 처치되었는지를 알아야 한다.

하지만 Enemy가 직접 GameMode를 가져와 방 종료를 처리하게 만들면,
적 클래스가 게임 흐름에 너무 강하게 의존한다고 생각했다.

그래서 적이 사망했을 때 Delegate/Event를 Broadcast하고, CombatRoom이 이를 받아 남은 적 수를 갱신하는 방식으로 구현했다.


BossRoom

보스방은 CombatRoom과 동일하게 작동하기에 해당 클래스를 부모로 하여 만들었다.

기존에 기반 코드를 미리 다 작성해 두었기 때문에
사진과 같이 기존 코드에서 보스방인지 확인하고 종료창으로 가는 구문만 추가하여 보스방을 구현할 수 있었다.


정리

이번에 GameMode, GameState, Room을 구현하면서 가장 많이 고민한 부분은 클래스별 책임을 어떻게 나눌 것인지였다.

현재 구조에서는 GameMode가 방 전환과 전체 게임 흐름을 담당하고,
Room은 자신이 언제 시작되고 언제 끝나는지, 그리고 방 내부에서 어떤 기능을 수행할지를 담당하도록 나누었다.
GameState는 UI나 플레이어에게 보여줘야 하는 상태 정보를 관리하도록 했다.

아직은 기본적인 게임 흐름만 구현한 상태지만,
이 구조를 바탕으로 보상방, 함정방, 보스방 전용 연출 등 다양한 기능을 추가해볼 수 있을 것 같다.
기능을 더 붙여보면서 지금의 역할 분리가 적절한지도 계속 고민해볼 예정이다.