본문 바로가기

게임 모드, 스테이트 블루프린트

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를 선택합니다.

요약 및 관계

RULES · SHARED STATE · PLAYER STATE

판단할 규칙과 전달할 상태의 책임을 나눕니다

서버는 GameMode에서 게임 규칙을 판단합니다. 클라이언트가 알아야 할 게임 전체 상태는 GameState에, 플레이어별 상태는 PlayerState에 둡니다.

게임 규칙과 복제 상태의 책임
클래스담당 정보네트워크와 수명
GameMode게임 규칙, 기본 클래스 선택, 스폰·매치 흐름서버의 인스턴스에서 판단합니다. 원격 클라이언트에 이 인스턴스를 복제하지 않습니다.
GameState라운드·남은 시간·팀 점수 등 게임 전체 상태서버가 변경한 공유 상태를 클라이언트에 전달합니다. 사용자 정의 변수의 복제 설정이 필요합니다.
PlayerState플레이어 이름·점수·팀 등 플레이어별 상태서버의 플레이어별 상태를 복제합니다. 사용자 정의 변수의 복제 설정을 확인합니다. Pawn과 분리해 재스폰 때 유지할 수 있으며, 영구 저장은 별도 설계입니다.
클래스: GameMode
담당 정보: 게임 규칙, 기본 클래스 선택, 스폰·매치 흐름
네트워크와 수명: 서버의 인스턴스에서 판단합니다. 원격 클라이언트에 이 인스턴스를 복제하지 않습니다.
클래스: GameState
담당 정보: 라운드·남은 시간·팀 점수 등 게임 전체 상태
네트워크와 수명: 서버가 변경한 공유 상태를 클라이언트에 전달합니다. 사용자 정의 변수의 복제 설정이 필요합니다.
클래스: PlayerState
담당 정보: 플레이어 이름·점수·팀 등 플레이어별 상태
네트워크와 수명: 서버의 플레이어별 상태를 복제합니다. 사용자 정의 변수의 복제 설정을 확인합니다. Pawn과 분리해 재스폰 때 유지할 수 있으며, 영구 저장은 별도 설계입니다.

수명과 영구 저장을 구분합니다

Standalone도 자체 서버 역할로 GameMode를 사용합니다. GameModeBase–GameStateBase 또는 GameMode–GameState의 계열을 맞춥니다. Pawn과 분리한 상태도 디스크 저장이나 모든 레벨 이동 때 자동 보존되는 것은 아닙니다.

관계
  • 게임 모드는 해당 게임에 어떤 게임 스테이트와 플레이어 스테이트 클래스를 사용할지 정의합니다.

이러한 프레임워크 클래스들은 멀티플레이어 게임에서 특히 중요하며, 각각의 역할 분담을 통해 게임 로직을 체계적으로 관리하고 네트워크 동기화를 효율적으로 처리할 수 있게 해 줍니다.

싱글 플레이어 게임에서도 이 구조를 따르면 코드를 깔끔하게 유지하고 확장성을 높일 수 있습니다.


이번 절에서는 언리얼 엔진 게임플레이 프레임워크의 핵심인 게임 모드, 게임 스테이트, 플레이어 스테이트의 역할과 기본적인 설정 방법에 대해 알아보았습니다.

예시

팀 점수 50점 이상이면 승리하는 규칙은 서버 GameMode에서 판단하고, 현재 팀 점수 30은 GameState의 공유 변수로 전달합니다. 개인 점수 20은 해당 플레이어의 PlayerState에 둡니다. 이 분리는 같은 숫자를 세 클래스에 중복 대입하라는 뜻이 아니라 규칙·게임 전체 값·개인 값을 각 책임에 맞게 두라는 뜻입니다.

클라이언트에서 읽을 상태 고르기

서버가 라운드를 2로 바꾸고 남은 시간을 90초로 갱신했습니다. 클라이언트 UI가 Get Game Mode로 이 값들을 직접 읽으려 하면 왜 실패할 수 있나요? 개인 점수 20인 플레이어의 Pawn만 새 인스턴스로 교체한다면 어디에 둔 점수를 유지할 수 있나요? 이 조건은 같은 세션의 PlayerState를 계속 사용하는 재스폰입니다.

규칙 인스턴스와 복제 상태 구분하기

원격 클라이언트에는 서버 GameMode 인스턴스가 없습니다. 라운드·남은 시간은 GameState의 사용자 정의 변수에 복제를 설정하고 서버에서 변경하여 UI가 받은 현재 값을 표시하도록 합니다. 복제 전달이 모든 화면에서 동시에 완료된다고 가정하지 않습니다. 같은 PlayerState를 유지하는 조건이면 그곳의 개인 점수 20을 유지할 수 있습니다. 새 Pawn 기본값이나 디스크 저장·재접속의 보존까지 이 조건에서 자동으로 따라오지는 않습니다.

이 클래스들은 게임의 규칙과 상태를 정의하고 관리하는 데 필수적인 요소입니다.