게임 모드, 스테이트 블루프린트
GameMode·GameState·PlayerState가 규칙과 공유 상태, 플레이어별 상태를 나누는 프레임워크 구조를 익힙니다.
지금까지는 캐릭터 애니메이션, UI, AI 등 게임 구성 요소를 개별적으로 다뤘습니다.
이 요소들을 유기적으로 연결해 규칙과 흐름을 제어하려면 견고한 게임플레이 프레임워크(Gameplay Framework)가 필요합니다.
언리얼 엔진은 이를 위해 미리 정의된 클래스 계층 구조를 제공합니다.
이번 장에서는 프레임워크 핵심인 게임 모드(Game Mode), 게임 스테이트(Game State), 플레이어 스테이트(Player State)를 다룹니다.
이 세 요소는 게임 규칙과 상태 관리의 중심입니다.
언리얼 엔진의 게임플레이 프레임워크는 여러 전용 클래스들이 협력하여 게임의 전반적인 규칙, 흐름, 그리고 현재 상태를 관리하도록 설계되어 있습니다.
이들은 각각 고유한 역할과 책임 영역을 가집니다.
이름이 비슷한 클래스도 존재 위치와 수명이 다르다. “누가 결정하는가”와 “누가 봐야 하는가”로 책임을 나눈다.
- GameMode
승리·스폰·점수 규칙을 결정 클라이언트에는 존재하지 않음
- GameState
남은 시간·팀 점수·경기 phase
- PlayerState
름·점수·팀·ping Pawn 교체 후에도 유지
게임 모드 (Game Mode)
게임 모드 (Game Mode)는 게임의 규칙을 정의하고 관리하는 클래스입니다.
이는 해당 게임의 전반적인 플레이 방식과 환경 설정을 제어합니다.
게임 모드는 서버에서만 존재하며, 클라이언트에는 존재하지 않습니다.
따라서 게임 모드에서 정의된 로직은 모든 플레이어에게 공통적으로 적용되는 규칙과 관련되어야 합니다.
주요 역할- 게임 규칙 정의: 승리 조건, 패배 조건, 점수 계산 방식 등 게임의 핵심 규칙을 설정합니다.
- 기본 클래스 설정: 해당 레벨에서 사용될 기본 폰(Default Pawn Class), AI 컨트롤러(AI Controller Class), 플레이어 컨트롤러(Player Controller Class), HUD 클래스, 게임 스테이트 클래스, 플레이어 스테이트 클래스 등을 지정합니다.
- 플레이어 스폰: 플레이어가 게임에 접속했을 때 스폰될 위치(Player Start)를 선택하고 캐릭터를 스폰합니다.
- 게임 흐름 제어: 라운드 시작/종료, 게임 시작/종료, 일시정지 등의 게임 전반적인 흐름을 관리합니다.
- 플레이어 접속/연결 해제 처리: 플레이어가 서버에 접속하거나 연결이 끊겼을 때의 로직을 처리합니다.
- (싱글 플레이어 게임의 경우) 전반적인 게임 상태 관리: 싱글 플레이어 게임에서는 게임 스테이트가 필요 없을 정도로 간단하다면 게임 모드가 직접 게임 상태를 관리하기도 합니다.
새 블루프린트 클래스 생성: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > GameModeBase 또는 GameMode를 부모 클래스로 선택합니다.
GameModeBase: 기본적인 게임 모드 기능을 제공하며, 대부분의 새 프로젝트에서 권장됩니다.GameMode:GameModeBase의 상위 클래스로, 레거시 시스템이나 특정 멀티플레이어 기능을 추가로 제공합니다. 특별한 이유가 없다면GameModeBase를 사용하는 것이 좋습니다.- 이름을 지정합니다. (예:
GM_MyGame)
편집(Edit)>프로젝트 세팅(Project Settings)>맵 및 모드(Maps & Modes)로 이동합니다.Default GameMode드롭다운에서GM_MyGame을 선택합니다.
- 특정 레벨에서만 다른 게임 모드를 사용하고 싶다면, 해당 레벨 에디터에서
월드 세팅(World Settings)패널을 엽니다. 게임 모드(Game Mode)섹션에서GameMode Override드롭다운을 통해 해당 레벨에서 사용할 게임 모드를 지정할 수 있습니다.
게임 스테이트 (Game State)
게임 스테이트 (Game State)는 현재 게임의 전반적인 상태를 복제하고 관리하는 클래스입니다.
이는 서버와 모든 클라이언트에 동시에 존재하며 복제(Replicated)됩니다.
따라서 모든 플레이어가 볼 수 있어야 하는 정보, 예를 들어 남은 시간, 현재 라운드, 팀 점수, 전체 게임 이벤트 로그 등을 관리하는 데 적합합니다.
주요 역할- 글로벌 게임 상태 저장: 게임의 현재 라운드, 남은 시간, 승리한 팀, 전체 게임의 점수 등 모든 플레이어에게 공유되어야 하는 정보를 저장하고 복제합니다.
- 게임 이벤트 로그: 게임 내에서 발생한 중요한 이벤트(예: 누가 누구를 처치했는지)를 기록하고 클라이언트에 전달합니다.
- 정보 동기화: 모든 클라이언트가 게임의 현재 상태에 대한 일관된 정보를 가질 수 있도록 합니다.
새 블루프린트 클래스 생성: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > GameStateBase 또는 GameState를 부모 클래스로 선택합니다.
GameStateBase: 기본 게임 스테이트 기능을 제공합니다.GameState:GameStateBase의 상위 클래스로, 레거시 시스템이나 특정 멀티플레이어 기능을 추가로 제공합니다.- 이름을 지정합니다. (예:
GS_MyGame)
- 여러분의 게임 모드 블루프린트(
GM_MyGame)를 엽니다. 클래스 디폴트(Class Defaults)를 클릭하고디테일(Details)패널에서클래스(Classes)섹션을 찾습니다.Game State Class드롭다운에서GS_MyGame을 선택합니다.
플레이어 스테이트 (Player State)
플레이어 스테이트 (Player State)는 각 개별 플레이어의 현재 상태를 복제하고 관리하는 클래스입니다.
게임 스테이트와 마찬가지로, 서버와 모든 클라이언트에 동시에 존재하며 복제됩니다.
따라서 다른 플레이어에게도 보여져야 하는 해당 플레이어만의 정보(점수, 이름, 처치 횟수, 현재 팀 등)를 관리하는 데 사용됩니다.
주요 역할- 개별 플레이어 정보 저장: 각 플레이어의 점수, 킬/데스 수, 현재 체력, 플레이어 이름, 팀 정보 등 해당 플레이어 고유의 게임 관련 데이터를 저장하고 복제합니다.
- 정보 동기화: 멀티플레이어 게임에서 다른 클라이언트의 플레이어 상태를 동기화하여, 모든 플레이어가 서로의 점수나 상태를 볼 수 있도록 합니다. (예: 스코어보드)
- 영구적인 플레이어 정보: 플레이어가 사망하여 폰이 변경되거나 재스폰되더라도 플레이어 스테이트는 유지됩니다.
새 블루프린트 클래스 생성: 콘텐츠 브라우저에서 마우스 오른쪽 버튼 클릭 > 블루프린트 클래스(Blueprint Class) > PlayerState 또는 PlayerStateBase를 부모 클래스로 선택합니다.
PlayerState가 일반적입니다.- 이름을 지정합니다. (예:
PS_MyPlayer)
- 여러분의 게임 모드 블루프린트(
GM_MyGame)를 엽니다. 클래스 디폴트(Class Defaults)를 클릭하고디테일(Details)패널에서클래스(Classes)섹션을 찾습니다.Player State Class드롭다운에서PS_MyPlayer를 선택합니다.
요약 및 관계
GameMode는 규칙을 결정하고, GameState와 PlayerState는 클라이언트가 읽어야 할 상태를 복제합니다.
- 존재 위치 서버에만 존재 서버
모든 클라이언트 서버와 모든 클라이언트
- 책임 규칙, 흐름, 기본 클래스
지정 경기 전체 시간, 라운드, 팀 점수 개별 플레이어 점수, 이름, 팀
- 수명 레벨 규칙
함께 유지 게임 세션 상태와 함께 유지 폰이 바뀌어도 플레이어 단위로 유지
- UI 접근 클라이언트 UI
직접 의존하지 않음 스코어보드의 전체 상태로 읽음 각 플레이어 행의 상태로 읽음
| 클래스 | 존재 위치 | 역할 | 복제 여부 |
|---|---|---|---|
| 게임 모드 (Game Mode) | 서버에만 존재 | 게임 규칙, 흐름, 기본 클래스 설정, 스폰 등 | X |
| 게임 스테이트 (Game State) | 서버 + 모든 클라이언트 | 게임 전체의 상태(점수, 시간, 라운드) 관리 | O |
| 플레이어 스테이트 (Player State) | 서버 + 모든 클라이언트 | 각 플레이어의 상태(개인 점수, 킬/데스) 관리 | O |
클라이언트가 알아야 하는 값을 GameMode에 숨기면 복제되지 않으므로 저장 위치를 먼저 나눈다.
| 클래스 | 존재/복제 범위 | 둘 값 |
|---|---|---|
| GameMode | 서버 전용 | 승리 조건, 스폰 규칙, 기본 클래스 지정 |
| GameState | 서버와 모든 클라이언트 | 라운드, 남은 시간, 팀 점수, 매치 상태 |
| PlayerState | 서버와 모든 클라이언트 | 플레이어 이름, 팀, 개인 점수, 킬/데스 |
| PlayerController | 서버와 소유 클라이언트 | 입력, 개인 UI, 카메라 피드백 |
- 게임 모드는 해당 게임에 어떤
게임 스테이트와플레이어 스테이트클래스를 사용할지 정의합니다. - 게임플레이 중
게임 모드는 서버에서만 게임의 전반적인 규칙을 적용하고 흐름을 제어합니다. 게임 스테이트는 게임의 글로벌 정보를 모든 플레이어에게 동기화합니다.플레이어 스테이트는 각 플레이어의 개별적인 정보를 모든 플레이어에게 동기화합니다.
이러한 프레임워크 클래스들은 멀티플레이어 게임에서 특히 중요하며, 각각의 역할 분담을 통해 게임 로직을 체계적으로 관리하고 네트워크 동기화를 효율적으로 처리할 수 있게 해줍니다.
싱글 플레이어 게임에서도 이 구조를 따르면 코드를 깔끔하게 유지하고 확장성을 높일 수 있습니다.
이번 절에서는 언리얼 엔진 게임플레이 프레임워크의 핵심인 게임 모드, 게임 스테이트, 플레이어 스테이트의 역할과 기본적인 설정 방법에 대해 알아보았습니다.
이 클래스들은 게임의 규칙과 상태를 정의하고 관리하는 데 필수적인 요소입니다.
게임플레이 프레임워크는 역할 이름보다 권한과 복제 범위로 나누면 이해가 쉽습니다.
아래 다이어그램은 주요 클래스의 책임 경계를 다시 정리합니다.
이름보다 누가 결정하고 누가 알아야 하는지를 기준으로 책임을 배치한다.
| 클래스 | 존재 위치 | 주 책임 | 복제 기준 |
|---|---|---|---|
| GameMode | 서버 전용 | 승패, 스폰, 매치 규칙 결정 | 클라이언트에는 직접 존재하지 않음 |
| GameState | 서버와 모든 클라이언트 | 전체 점수, 남은 시간, 매치 상태 공유 | 모두가 봐야 하는 값 |
| PlayerState | 서버와 모든 클라이언트 | 플레이어별 점수, 이름, 팀 정보 | 개인 상태지만 모두에게 공개 가능 |
| PlayerController | 서버와 소유 클라이언트 | 입력, 카메라, 개인 UI 연결 | 소유자 중심 정보 |
| Pawn | 월드에 배치/스폰 | 실제 이동과 충돌, 애니메이션 대상 | 위치와 공개 상태 |
게임 모드, 게임 스테이트, 플레이어 스테이트는 “어디에 존재하고 누구에게 복제되는가”를 기준으로 두면 싱글플레이와 멀티플레이 구조가 함께 정리됩니다.
GameMode, GameState, PlayerState는 이름보다 서버 전용인지, 모든 클라이언트에 복제되는지로 구분하면 역할이 선명합니다.
- 권한 단서권한 단서 GameMode GameState
PlayerState
- 서버 규칙
GameMode는 서버에만 존재하며 승패, 스폰, 기본 클래스 같은 규칙을 결정합니다.
- 전체 상태
GameState는 라운드 시간, 팀 점수처럼 모든 플레이어가 알아야 할 값을 동기화합니다.
- 개별 상태
PlayerState는 각 플레이어의 점수와 이름처럼 폰이 바뀌어도 남는 정보를 보관합니다.
- authority
값을 누가 결정하는지 서버 기준으로 확인합니다.
- replicate
클라이언트가 알아야 하는 상태인지 구분합니다.
- lifetime
재스폰 뒤에도 남아야 하는지 봅니다.
- class setup
GameMode의 기본 클래스 설정을 확인합니다.
마지막으로 GameMode, GameState, PlayerState가 어떤 상태를 맡아야 하는지 권한 기준으로 정리합니다.
GameMode, GameState, PlayerState는 비슷해 보여도 서버 권한과 복제 범위가 다릅니다.
- 서버 전용 결정과 공유 상태를 분리
규칙 결정은 GameMode에 두고, 모든 클라이언트가 봐야 하는 경기 시간과 점수는 GameState나 PlayerState로 복제합니다. 01 스폰 규칙, 승리 조건, 라운드 시작처럼 서버에서만 실행되는 게임 규칙을 관리합니다. 02 남은 시간, 팀 점수, 매치 단계처럼 모든 플레이어가 알아야 하는 전역 상태를 보관합니다. 03 개별 점수, 닉네임, 팀 번호처럼 Pawn이 바뀌어도 유지되는 플레이어별 상태를 담습니다.
- 서버 전용 결정과 공유 상태를 분리
규칙 결정은 GameMode에 두고, 모든 클라이언트가 봐야 하는 경기 시간과 점수는 GameState나 PlayerState로 복제합니다.
- GameMode
스폰 규칙, 승리 조건, 라운드 시작처럼 서버에서만 실행되는 게임 규칙을 관리합니다.
- GameState
남은 시간, 팀 점수, 매치 단계처럼 모든 플레이어가 알아야 하는 전역 상태를 보관합니다.
- PlayerState
개별 점수, 닉네임, 팀 번호처럼 Pawn이 바뀌어도 유지되는 플레이어별 상태를 담습니다.