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