⊙ Unreal Engine의 GameMode가 무엇인지 이해한다.
⊙ GameMode 클래스를 생성하는 방법에 대해 안다.
⊙ 생성한 GameMode 클래스를 적용하는 방법을 안다.
GameMode란?
게임을 제작하다보면 가장 큰 컨트롤 타워 하나는 꼭 필요하다. Unity의 경우 GameManager을 만들어서 싱글톤으로 만들고 모든 씬에 존재하게 하여 게임을 컨트롤 했었다. 언리얼에서는 그런 컨트롤 타워를 GameMode 라는 이름으로 제공하고 있다.
GameMode는 게임의 총괄 관리자라고 생각할 수 있다. 게임의 전반적인 규칙과 흐름을 총괄 관리하는 클래스인 GameMode는 그래서 게임 전반적으로 상당히 많은 부분을 관리하고 있다. 어떤 플레이어로 스폰할건지, 어떤 PlayerController를 사용할지, 게임이 어떤 조건에서 종료 되는지, 점수 계산은 어떻게 할지 등등 게임 플레이의 핵심 로직을 담당한다. 이건 아래서 더 자세히 알아보자.
아래 클래스 적용할 때 눈으로 직접 보게 될 것이지만 GameMode는 전역으로 모든 레벨에 영향을 주는 것도 있지만 레벨 별로 존재하기도 한다. 예를 들어 튜토리얼 맵 전용과 일반 맵 전용을 구분하는 등 말이다.
주요 기능과 책임
- 플레이어 Pawn/Character 스폰
: 게임 시작될 때 (또는 플레이어가 리스폰될 때), DefaultPawnClass 또는 지정한 Pawn 클래스를 자동으로 스폰한다. 그리고 스폰된 Pawn을 플레이어가 조작할 수 있도록 PlayerController와 연동해주는 역할을 한다. - PlayerController 지정
: 플레이어의 입력(키보드, 마우스, 게임패드 등)을 전달하고 처리하는 PlayerController가 어떤 클래스로 동작할지 설정한다. - 게임 규칙 관리
: 점수 계산, 타이머, 라운드 제어, 난이도 등 게임 전반의 규칙을 정의하고 유지한다. 특정 점수 달성, 보스 몬스터 처치, 제한 시간 종료 등 승리/패배를 결정하는 조건을 관리한다. 승패가 결졍되면 그 다음 어떤 식으로 처리할 것인지(게임 오버 팝업, 레벨 전환 등)도 담당한다. - GameState / PalyerState 사용
: GameState는 전체 게임 흐름(타이머, 전역 변수 등), PlayerState는 플레이어별 정보(체력, 점수 등)를 관리하는 용도로 쓰일 수 있습니다. 멀티 플레이 만큼 복잡하게 쓰진 않더라도, 상태 저장과 관리를 좀 더 체계적으로 하고 싶을 때 유용하다.
내가 만든 규칙과 게임 관리를 적용하려면 직접 GameMode 클래스를 생성하여 적용해주어야 한다. 내가 직접 GameMode 클래스를 어떻게 만드는지부터 알아보자.
GameMode 클래스 생성
C++ 클래스를 만드는 방법이야 이 때까지 아주 많이 해왔다. GameMode 클래스를 생성하면서 다른 점은 부모 클래스를 GameMode로 하는 것 뿐이다. (GameMode도 Actor의 자식이긴 하지만) 상단 메뉴 Tools → New C++ Class를 클릭하여 클래스를 생성한다. 부모 클래스를 선택하는 창에서는 GameMode를 선택하여 생성한다.
GameMode VS GameModeBase
부모를 선택하려고 GameMode를 검색하면 GameMode라는 글자를 달고 있는 클래스가 3개는 나온다. 그 중 GameMode와 GameModeBase의 차이에 대해서 알아보자.
이름은 비슷하고 둘중 무얼 골라야 할지 애매해 보이지만 사실 둘은 차이가 존재한다.
GameMode는 언리얼에서 제공하는 멀티플레이 기능(세션, 플레이어 연결 로직 등)을 일부 포함하고 있으며, 싱글 플레이에서도 문제없이 사용할 수 있다. 필요에 따라 GameState, PlayerState등 연동이 활성화 되어 있다.
GameModeBase는 GameMode에서 몇 가지 가볍게 덜어놓은 버전이라고 생각하면 된다. 무엇을 덜어 놓았냐고 묻는다면 멀티 플레이 관련 로직을 덜어 놓았다고 할 수 있겠다. 그래서 멀티 플레이 게임 보다는 간단한 싱글 플레이 게임에서 사용할 수 있다. 또는 언리얼에서 제공하는 멀티 플레이 로직이 아닌 직접 구현한 멀티 플레이 로직을 사용하고 싶을 때도 사용할 수 있다.
이번 실습에서는 GameMode를 사용하여 클래스를 생성해보겠다.
GameMode 클래스 구성
클래스를 생성하면 언제나 그렇듯 h 파일과 cpp 파일이 생성되는데 여직 보던 Actor 클래스들과는 다르게 좀 비어 보이는게 사실이다. 아래는 각각 헤더 파일과 cpp 파일이다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "GameFramework/GameMode.h"
#include "SpartaGameMode.generated.h"
UCLASS()
class CH3_LEARNINGPROJECT_API ASpartaGameMode : public AGameMode
{
GENERATED_BODY()
};
// Fill out your copyright notice in the Description page of Project Settings.
#include "SpartaGameMode.h"
아무것도 없어서 아무것도 사용할 수 없을 것이라고 생각해서는 안된다. GameMode 클래스도 결국 Actor 클래스의 상속을 받고 있기 때문에 이전에 사용하던 라이프 사이클 함수들을 모두 사용할 수 있다.
GameMode 클래스 적용
만들어 놓은 클래스를 만들기만 해서는 안되고 직접 적용할 수 있어야 한다. 앞서 이야기하긴 했는데 기억이 날지 모르겠지만 GameMode는 두 곳에 적용할 수 있다. 하나는 게임 전역을 관리하는 GameMode고, 다른 하나는 하나의 레벨만을 관리하는 GameMode다. 두 방법 모두 알아보도록 하겠다.
그 전에 C++ GameMode 클래스를 게임에서 활용하려면, 블루프린트 클래스로 한 번 더 감싸는 방식을 권장한다. 이유는 내가 더 편하기 때문이다. C++ 클래스는 세부 파라미터를 수정하기 복잡한데 블루프린트는 에디터에서 세부 파라미터를 수정하기 훨씬 편리하다. 따라서 블루프린트 클래스로 한 번 감싸고 시작한다.
전체(모든 레벨)에 적용
상단 메뉴 Edit → ProjectSetting으로 이동면 팝업창이 하나 뜨게 된다. 이 팝업창 왼쪽을 살펴보면 Maps & Modes 항목을 찾을 수 있다. 이 항목을 누르면 본적 있는 설정창이 보이게 된다. (이전에 기본 맵을 지정할 때 본적 있는 곳이다.)
Default GameMode를 내가 만들고 블루 프린트로 감싼 BP_SpartaGameMode로 지정하면 적용이 완료된다.
한 레벨에 적용
상단 메뉴 Window → World Settings를 클릭하면 창이 열리게 된다. 나의 경우 Detail창 바로 옆에 생겼다. World Settings 창에서 마찬가지로 GameMode Override를 생성한 BP_SpartaGameMode로 바꿔주면 적용이 완료된다.
이 때 드는 한 가지 걱정. 전역으로도 게임 모드를 지정하고 한 레벨에도 게임 모드를 지정하였다면 두 모드가 충돌하지는 않을까? 다행히도 두 모드가 함께 지정되어 있다면 한 레벨에 적용한 게임 모드를 우선으로 하여 적용된다.
적용된 모드를 확인하려면 플레이 버튼을 눌러보면 된다. 그리고 Outliner창을 보면 내가 적용한 GameMode가 레벨 내에 생성된 것을 볼 수 있다.
GameMode 기본 설정 확인
World Settings에서건 Project Setting에서건 둘다 Selected GameMode를 아래로 열어보면 다양한 클래스들을 넣을 수 있도록 되어 있다. 이미 들어가 있는 것들은 기본 클래스들이다.
각각 무슨 역할들인지 알아보면 아래와 같다.
클래스 | 설명 |
Default Pawn Class | 레벨 시작 시 플레이어가 조종하게 될 Pawn(또는 Character) 클래스를 지정 |
HUD Class | 게임 화면에 표시되는 HUD(UI) 요소를 관리하는 클래스를 지정 |
Player Controller Class | 플레이어 입력 처리와 카메라 제어, UI와의 상호작용을 담당하는 클래스를 지정한다. |
Game State Class / Player State Class | 게임의 전역 상태나 플레이어별 상태를 추적할 때 사용 |
Spectator Class | 관전자 모드에서 사용할 Pawn 클래스를 지정 일반 플레이어와 다른 이동 방식이나 카메라 제어가 필요할 때 활용 |
이렇게 보니까 아까 정리했던 GameMode의 기능과 책임이 더 와닿는 것 같다. 플레이어가 조종할 Pawn 또는 Character 지정, 그리고 Controller 지정 등 여기 있는 것들을 관리하는 것이 GameMode의 기능과 책임이다.
여기 들어가 있는 클래스들은 플레이 버튼을 누르면 GameMode와 함께 생성되는 것을 확인할 수 있다.
작은 제목
작은 설명
배운 내용 정리
- GameMode는 게임의 총괄 관리자라고 생각할 수 있다.
- GameMode는 플레이어 Pawn/Character 스폰, PlayerController 지정, 게임 규칙 관리, GameState, PlayerState 사용의 기능과 책임이 있다.
- GameMode 클래스를 생성하면서 다른 점은 부모 클래스를 GameMode로 하는 것 뿐이다. (GameMode와 GameModeBase에 차이 있음)
- C++ GameMode 클래스를 게임에서 활용하려면, 블루프린트 클래스로 한 번 더 감싸는 방식을 권장한다.
- 상단 메뉴 Edit → ProjectSetting → Maps&Modes에서 전역 게임 모드를 지정할 수 있고 Window → World Settings에서 레벨 게임 모드를 지정할 수 있다.
'Unreal Engine 5 > C++와 Unreal Engine으로 3D 게임 개발' 카테고리의 다른 글
레벨 위에 Character 클래스 생성 (0) | 2025.01.24 |
---|---|
Actor의 생명 주기(Life Cycle) (0) | 2025.01.22 |
OutputLog에 로그 출력 (0) | 2025.01.22 |
Actor 클래스의 코드 구조 (0) | 2025.01.21 |
프로젝트 이주(Migrate) 하기 (0) | 2025.01.21 |