플레이중인 게임의 정보를 처리하는 클래스는 크게 Game Mode (게임 모드)와 Game State (게임 스테이트), 둘입니다.
가장 제약이 없다는 게임일지라도 토대가 되는 규칙들이 있으며, 이러한 규칙들이 게임 모드를 이룹니다. 가장 기본적인 수준에서 이러한 규칙에 포함되는 것은 다음과 같습니다:
게임에 규칙 관련 이벤트가 발생하고 트래킹을 통해 모든 플레이어와 공유할 필요가 있을 때, 그 정보는 게임 스테이트 에 보관되고 그를 통해 동기화됩니다. 이 정보에 포함되는 것들은 다음과 같습니다:
플레이하는 데 필요한 플레이어 수, 그 플레이어가 게임에 참가하는 방식 등의 기본적인 요소들은 여러 유형의 게임에 공통이지만, 어떤 게임을 개발하는지에 따라 무한대의 규칙 변종이 가능합니다. 그 규칙과이 무엇이든, 그 정의와 구현은 게임 모드에 합니다. 현재 게임 모드에 흔히 쓰이는 베이스 클래스는 둘 입니다.
엔진 버전 4.14 에는 AGameModeBase
가 도입되었는데, 모든 게임 모드의 베이스 클래스로, 고전 AGameMode
를 단순화시키고 효율화시킨 버전입니다. 4.14 이전의 게임 모드 베이스 클래스였던 AGameMode
는 전과 마찬가지로 존재하며 기능도 그대로이지만, 이제 AGameModeBase
의 자손이 되었습니다. AGameMode
는 그 경기 상태 개념 구현 방식상 멀티플레이어 슈팅과 같은 표준 게임 유형에 보다 적합합니다. AGameModeBase
는 새로운 코드 프로젝트에 포함된 새로운 기본 게임 모드로, 보다 단순하고 효율적입니다.
모든 게임 모드는 AGameModeBase
의 서브클래스로, 덮어쓸 수 있는 기본 함수 기능이 상당량 들어있습니다. 흔히 쓰이는 함수는 다음과 같습니다:
함수/이벤트 | 용도 |
---|---|
InitGame | InitGame 이벤트는 (PreInitializeComponentsPreInitializeComponents |
PreLogin | 서버에 접근 시도중인 플레이어를 수락 또는 거부합니다. ErrorMessage 에 공백이 아닌 스트링을 입력하면 Login 함수가 실패하도록 만듭니다. PreLogin 은 Login 전 호출되며, 참가하는 플레이어가 게임 콘텐츠를 다운로드해야 하는 경우 시간이 한참 지나서야 Login 이 호출될 수도 있습니다. |
PostLogin | 로그인 성공 이후 호출됩니다. PlayerController 에서 리플리케이트되는 함수 호출을 하기에 안전한 첫 번째 장소입니다. 블루프린트로 OnPostLogin 을 구현하여 부가 로직을 추가할 수 있습니다. |
HandleStartingNewPlayer | PostLogin 또는 심리스 트래블 이후 호출되며, 블루프린트에서 덮어써서 새 플레이어에게 벌어지는 일을 변경할 수 있습니다. 기본적으로 플레이어에 대한 폰을 생성합니다. |
RestartPlayer | 플레이어의 폰 스폰을 시작하기 위해 호출됩니다. 폰의 스폰 위치를 지정하고자 하는 경우 사용할 수 있는 함수 RestartPlayerAtPlayerStart 와 RestartPlayerAtTransform 도 있습니다. OnRestartPlayer 를 블루프린트에서 구현하여 이 함수 완료 후의 로직을 추가할 수 있습니다. |
SpawnDefaultPawnAtTransform | 플레이어의 폰이 실제 스폰되는 곳으로, 블루프린트에서 덮어쓸 수 있습니다. |
Logout | 플레이어가 게임을 떠나거나 소멸되었을 때 호출됩니다. OnLogout 을 구현하여 블루프린트 로직을 짤 수 있습니다. |
게임이 제공하는 경기 포맷, 미션 유형, 특별 지역 각각에 대해 AGameModeBase
클래스의 서브클래스를 만들 수 있습니다. 게임에는 게임 모드가 몇이든 있을 수 있듯이 AGameModeBase
의 서브클래스도 그러하지만, 한 번에 하나의 게임 모드만 사용할 수 있습니다. 게임 모드 액터는 UGameEngine::LoadMap()
를 통해 플레이할 레벨을 초기화시킬 때마다 인스턴스를 만듭니다.
게임 모드는 멀티플레이어 게임에 참가하는 원격 클라이언트에 리플리케이트되지 않습니다. 서버에만 존재하므로, 로컬 클라이언트는 원본 게임 모드 클래스 (또는 블루프린트)를 볼 수 있지만 실제 인스턴스에 접근하여 변수를 확인하고 게임 도중 무엇이 변경되었는가 확인할 수는 없습니다. 플레이어가 현재 게임 모드 관련해서 업데이트된 정보가 필요한 경우, 그 정보는 AGameStateBase
액터에 저장된 내용을 통해 쉽게 동기화 상태를 유지할 수 있으며, 이 중 하나를 게임 모드와 함께 생성한 다음 모든 원격 클라이언트로 리플리케이트합니다.