언리얼 엔진에서 플레이 중인 게임의 정보를 처리하는 클래스는 크게 게임 모드
와 게임 스테이트
, 둘로 나뉜다. 매우 간단한 게임일지라도 게임을 통제하는 규칙은 존재하며 이러한 규칙들이 게임 모드
를 이룬다. 기본적으로 게임 모드
에 포함되는 규칙들의 예시는 다음과 같다.
- 존재하는 플레이어와 관람자의 수는 물론, 허용된 플레이어와 관람자 최대 수
- 플레이어가 게임에 들어오는 방식, 스폰 위치 선택 규칙과 기타 스폰/리스폰 동작 포함 가능
- 게임 일시정지 가능 여부, 게임 일시정지 처리 방식
- 레벨간의 전환, 게임의 시네마틱 모드 시작 여부 포함
이러한 게임 모드
에서 관리하는 규칙의 특징은 게임 중에 변하지 않을 정보들이라는 것이다. 자주 혹은 종종 변경될 수 있는 정보는 게임 모드
에서 관리하지 않는 것이 좋다. 또한 게임 형식, 미션 유형, 특별 지역 규칙 등(예를 들어 하나의 FPS 게임 내에 데스매치, 폭파 임무, 점령전 등이 있는 식)에 따라 AGameModeBase
의 서브클래스를 생성할 수 있다. 한 게임에 여러 게임 모드
가 있을 수 있지만, 한 번에 하나의 게임 모드
만 사용할 수 있다.
반면 게임에 규칙 관련 이벤트가 발생하고 트래킹을 통해 정보를 모든 플레이어가 공유할 필요가 있을 때, 그 정보는 게임 스테이트
에 보관되고 그를 통해 동기화된다. 그 정보의 예시는 다음과 같다.
- 게임 실행 기간 (로컬 플레이어 참가 전 실행 시간 포함).
- 각 플레이어의 게임 참가 기간, 그 플레이어의 현재 상태.
- 현재 게임 모드의 베이스 클래스.
- 게임 시작 여부.
UE 4.14 버전부터 AGameModeBase
가 도입되었다. 이는 모든 게임 모드의 베이스 클래스로, 고전 AGameMode
클래스를 단순화하고 효율화시킨 버전이다. 4.14 이전의 게임 모드 베이스 클래스였던 AGameMode
는 기능도 그대로이고 사용하는 방법도 똑같지만 이젠 AGameModeBase
의 자손이 되었다.
AGameMode
는 경기 상태 개념 구현 방식상 멀티플레이어 슈팅 게임과 같은 유형에 보다 적합하다. EnteringMap
(맵 진입), WaitingToStart
(시작 대기 중), InProgress
(진행 중), WaitingPostMatch
(경기 후 대기) 등 경기 상태에 대한 부가 함수를 지원하며, 자세한 내용은 UE4 공식 문서 - 게임 모드와 게임 스테이트의 'AGameMode' 항목에 자세히 나와 있다.
게임 스테이트
는 클라이언트가 게임의 상태를 모니터링할 수 있도록 해준다. 접속한 모든 클라이언트가 알아야 하는 정보, 플레이어 개개인이 아닌 게임 모드에 관련된 정보를 관리해야 한다. 따라서 접속한 플레이어 목록, 팀의 게임 점수, 오픈 월드 게임에서 완료한 미션 등 다양한 게임 전반적인 프로퍼티 기록을 유지할 수 있다.
FPS 게임에서 팀 킬 스코어 중 특정 플레이어의 킬 스코어가 몇 점인지와 같은 개별 플레이어의 기록을 유지하기 좋은 곳은 아니다. 그런 내용은 플레이어 스테이트
에서 보다 깔끔하게 처리할 수 있다. 일반적으로 게임 스테이트
는 게임플레이 도중 변하면서 모두에게 관련이 있고 보일 수 있는 프로퍼티 기록을 유지해야 한다. 게임 모드
는 서버에만 존재하지만 게임 스테이트
는 서버에 존재하면서 모든 클라이언트에 리플리케이트되어, 연결된 모든 기기의 게임 최신 상태를 유지한다.
AGameStateBase
가 기본 구현이며, 게임에서 무슨 일이 벌어지고 있는지 플레이어에게 지속적으로 알리기 위해 필요한 변수와 함수를 넣기 위해 C++ 또는 블루프린트로 자주 확장시키는 클래스이다.