GameMode
GameMode 이해하기
1️⃣ GameMode란?
- GameMode는 게임의 전반적인 규칙과 흐름을 총괄 관리하는, 일종의 컨트롤 타워 역할을 하는 클래스입니다.
- 다른 곳에서 사용하는 GameManager 와 동일하다고 생각하면 됩니다.
- 단! GameMode는 Singleton처럼 “하나만 있는 관리자”처럼 보이지만, 직접 Singleton으로 만드는 클래스는 아니고 언리얼이 월드 단위로 자동 관리하는 게임 규칙 클래스예요.
- GameMode는 언리얼 엔진이 월드마다 하나씩 생성해서 관리하는 게임 규칙 관리자
- 싱글 플레이에서는 ‘서버’와 ‘클라이언트’ 개념이 나뉘지 않으므로, GameMode가 온전히 로컬에서 동작하여 게임 전체를 제어합니다.
- 어떤 Pawn (또는 Character)을 플레이어에게 스폰해줄지, 어떤 PlayerController를 사용할지, 승패 조건이나 점수 계산 방법은 어떻게 설정할지 등 게임 플레이의 핵심 로직을 담당합니다.
- PlayerController 클래스: input 을 받아서 조종가능한 (Playable) 캐릭터에 연결해서 조종하는 역할 = 캐릭터에 빙의 한다는 개념.
- 프로젝트 전역(기본) 혹은 레벨별로 필요한 GameMode를 구분해 설정할 수 있습니다. (예: 튜토리얼 맵 전용 GameMode, 일반 맵 전용 GameMode 등)
2️⃣ GameMode의 주요 기능과 책임 4가지
Pawn/Character 스폰, PlayerController 지정, Game Logic 게임 규칙 관리 (함수), GameState / PlayerState 사용
- 플레이어 Pawn/Character 스폰
- 게임이 시작될 때 (또는 플레이어가 리스폰될 때), DefaultPawnClass 또는 지정한 Pawn 클래스를 자동으로 스폰합니다.
- 스폰된 Pawn을 플레이어가 조작할 수 있도록 PlayerController와 연동해주는 역할을 합니다.
- PlayerController 지정
- 플레이어의 입력(키보드, 마우스, 게임패드 등)을 전달하고 처리하는 PlayerController가 어떤 클래스로 동작할지 설정합니다.
- Game Logic 게임 규칙 관리 (함수)
- 점수 계산, 타이머, 라운드 제어, 난이도 등 게임 전반의 규칙을 정의하고 유지합니다.
- 특정 점수 달성, 보스 몬스터 처치, 제한 시간 종료 등 승리/패배를 결정하는 조건을 관리합니다.
- 승리 혹은 패배가 확정되면, 게임 오버 화면을 띄우거나 다음 레벨로 전환하는 식의 후속 처리를 담당합니다.
- GameState / PlayerState 사용
- GameState는 전체 게임 흐름 (타이머, 전역 변수 등)
- PlayerState는 플레이어별 정보 (체력, 점수 등)를 관리하는 용도로 쓰일 수 있습니다.
- 주로 멀티플레이어 게임에서 많이 사용 합니다.
- 멀티플레이만큼 복잡하게 쓰진 않더라도, 상태 저장과 관리를 좀 더 체계적으로 하고 싶을 때 유용합니다.
GameMode 클래스 생성하기
1️⃣ GameMode vs GameModeBase
- 언리얼 엔진 5에는 GameMode와 GameModeBase 두 종류가 있습니다.
- GameMode
- 언리얼에서 제공하는 멀티플레이 기능 (세션, 플레이어 연결 로직 등)을 일부 포함하고 있으며, 싱글 플레이에서도 문제없이 사용할 수 있습니다.
- 필요에 따라 GameState, PlayerState 등 연동이 활성화되어 있습니다
- GameModeBase
- 좀 더 단순화된 형태로, 멀티플레이 관련 로직이 거의 포함되지 않습니다.
- 간단한 싱글 플레이 게임 또는 직접 멀티플레이 로직을 구현하고 싶을 때 사용하기도 합니다.

2️⃣ C++ 클래스 GameMode 생성
- 언리얼 에디터 상단 메뉴에서 Tools → New C++ Class를 클릭합니다.

- Common Classes 목록 또는 검색창에서 GameMode를 선택합니다.

- 클래스 접근 수준을 Public으로 설정한 후, 클래스 이름을 SpartaGameMode로 지정하고 Create Class 버튼을 클릭합니다.

- 아직 아무런 로직이 구현되지 않은 기본 골격만 갖춘 상태입니다. 우선은 수정 없이 그대로 둡니다.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "MainGameMode.generated.h"
UCLASS()
class BC_CH3_ASSIGNMENT_4_API AMainGameMode : public AGameMode
{
GENERATED_BODY()
};
3️⃣ GameMode 클래스 적용
- 직접 만든 C++ GameMode 클래스를 게임에서 활용하려면, 일반적으로 블루프린트 클래스로 한 번 더 감싸는 방식을 권장합니다. 이렇게 하면, 에디터에서 세부 파라미터를 수정하기 훨씬 편리하기 때문입니다.
- Content Browser에서 생성한 GameMode를 우클릭하고, Create Blueprint Class based on MainGameMode를 선택합니다.

- 이름은 BP_MainGameMode로 지정하고, Blueprints 폴더에 생성합니다.
언리얼 엔진에서 GameMode를 적용하는 방법은 크게 두 가지입니다.
1.프로젝트 전역 설정
- 상단 메뉴 Edit → Project Settings로 이동 → 왼쪽 목록에서 Maps & Modes 항목 선택
- Default GameMode를 BP_MainGameMode로 지정


이제 현재 프로젝트의 모든 레벨에 대해 기본 GameMode가 BP_MainGameMode 가 됩니다.
- GameMode 가 관리하는 Class들

2. 레벨 별 설정
- World Settings -> Game Mode 에서 설정

- 현재 열려 있는 레벨의 GameMode Override를 BP_MainGameMode로 지정

- 이렇게 하면, 이 특정 레벨은 프로젝트 전역 설정 대신 BP_MainGameMode 를 사용하게 됩니다.
- 만약 프로젝트 전역 설정과 레벨 별 설정이 충돌한다면, 레벨 별 설정 (World Settings)이 우선 적용됩니다. 즉, 레벨에서 오버라이드된 GameMode가 존재한다면 그 레벨에서는 해당 GameMode를 사용하고, 그렇지 않은 레벨은 전역에 설정된 GameMode를 사용합니다.
4️⃣ GameMode 기본 설정 확인
- 현재 BP_SpartaGameMode에는 별도의 코드나 설정이 없으므로, 언리얼 엔진의 기본값이 적용됩니다.
- World Settings 창의 ‘Selected GameMode’ 영역을 펼쳐보면 다음과 같은 기본 클래스를 확인할 수 있습니다.
- Default Pawn Class: 레벨 시작 시 플레이어가 조종하게 될 Pawn (또는 Character) 클래스를 지정합니다.
- HUD Class: 게임 화면에 표시되는 HUD(UI) 요소를 관리하는 클래스를 지정합니다.
- Player Controller Class: 플레이어 입력 처리와 카메라 제어, UI와의 상호작용을 담당하는 클래스를 지정합니다.
- Game State Class / Player State Class: 게임의 전역 상태나 플레이어별 상태를 추적할 때 사용합니다.
- Spectator Class: 관전자 모드에서 사용할 Pawn 클래스를 지정합니다. 일반 플레이어와 다른 이동 방식이나 카메라 제어가 필요할 때 활용합니다.
DefaultPawnClass는 “게임 시작 시 어떤 캐릭터 (Pawn)를 플레이어에게 제공할 것인지”를 결정합니다.

(Blueprint에서 이렇게 설정했으면 C++ 에서 따로 다시 안해도 되지만 안전을 위해서 해두자)
! 주의 MainChacter는 만들어 둔 상태여야 한다.
#include "MainGameMode.h"
#include "MainCharacter.h"
AMainGameMode::AMainGameMode()
{
// StaticClass(): 클래스 이름을 통해서 호출해주는것
DefaultPawnClass = AMainCharacter::StaticClass();
//
}
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "MainGameMode.generated.h"
UCLASS()
class BC_CH3_ASSIGNMENT_4_API AMainGameMode : public AGameMode
{
GENERATED_BODY()
public:
AMainGameMode();
};
StaticClass(): 클래스 이름을 통해서 호출해주는것.
- 말그대로 Static 이기 때문에 객체를 생성하지 않아도 선언해주는 것
추천
[Unreal Engine/UE 기초] - Character 클래스 구현 | [언리얼 엔진 C++ (Unreal Engine C++)]
[페이지] Unreal Engine | 언리얼 엔진