C++/Unreal Engine

[UE4] 게임 플레이 프레임워크 (GameMode, PlayerController, Pawn)

로파이 2021. 9. 30. 17:36

참고 : https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Framework/

 

플레이어를 중심으로 진행되는 게임 프레임워크를 구성하는 요소를 알아본다.

  • GameMode : 게임의 규칙을 지정한다.
  • PlayerController: 폰을 소유하여 플레이어의 조종 방법을 정의한다.
  • Pawn: 플레이어의 실제 게임 공간상의 오브젝트를 지칭한다.

PlayerController에 정의된 조종 방식을 사용하거나 고유 방법으로 Pawn의 동작 방식을 설계한다.

 

폰과 캐릭터

  • Pawn : 실제 월드 상의 Agent 역할을 하는 Actor 클래스로 Controller에 의해 소유될 수 있다.
  • Character : 휴머노이드 방식의 폰 클래스를 지칭한다. 기본적으로 충돌을 위한 CapsuleComponent와 CharacterMovementComponent를 가지고 있다. 인간과 유사한 이동 방식을 물리적으로 표현한다.

플레이어 제어

  • Controller : Pawn을 조종하기 위한 클래스로 AIController와 PlayerController로 파생된다. "Possess"라는 메세드로 폰을 조종할 수 있다.
  • PlayerController : PlayerController는 폰과 인간 플레이어 사이의 인터페이스로 인간 플레이어를 가장한 조종방식을 표현한다.
  • AIController : AIController는 폰을 제어하기 위한 시뮬레이션된 제어를 표현한다. 

플레이어 정보 표시

  • HUD: 플레이어의 상태를 표현하는 UI
  • Camera: 플레이어를 따라가며 관찰하는 카메라

게임의 규칙을 정하기

  • GameMode :  게임의 컨셉은 Game Mode와 Game State의 정의로 이루어진다. 서버에서 주로 정의되고 클라이언트로 전송되는 정보가 없어야한다.
  • GameState : 현재 접속중인 플레이어, 점수, 체스 말판의 상태, 임무 목표 리스트 등 게임 상태를 의미한다.
  • PlayerState : 게임의 참여자에 관련된 상태를 의미한다. Player가 아닌 AI는 PlayerState를 가지지 않으며 플레이어의 이름, 점수, 랭크 등의 정보를 나타낸다.

 

프레임워크 구성요소간의 관계

https://docs.unrealengine.com/4.27/en-US/InteractiveExperiences/Framework/QuickReference/

 

Game Mode

 

AGameModeBase

AGameMode 클래스는 AGameModeBase를 기반으로하는 클래스로 다음과 같은 함수 기능을 지닌다.

Function/Event Purpose
InitGame InitGame Event는 모든 컴포넌트의 초기화 이전에 호출되며, AGameModeBasePreinitializeComponents에 의해 실현된다.
PreLogin 서버를 참가하려는 플레이어를 수락하거나 리젝한다. Login 함수 호출 이전에 호출되며 플레이어가 game contents를 다운로드하는 등의 시간으로 오래걸릴 수 있다.
PostLogin 성공적인 로그인 이후에 호출되며 블루 프린트에서 PlayerController에 이 시점에 대한 로직을 추가할 수 있다.
HandleStartingNewPlayer PostLogin 이후에 호출되며 블루프린트에서 새로운 폰을 생성할 때 필요한 로직을 추가할 수 있다.
RestartPlayer 플레이어의 스폰 지점을 지정할 수 있다. 블루 프린트에서 OnRestartPlayer를 이용하여 이 함수 이후에 필요한 로직을 추가할 수 있다.
SpawnDefaultPawnAtTransform 실제 폰을 생성한다.
Logout 플레이어가 퇴장 이후 호출된다. 블루 프린트에서 OnLogout을 구현할 수 있다.

GameMode는 원격 클라이언트에서 복제되지 않고 서버에서만 존재하는 유일한 인스턴스이다. 로컬 클라이언트에서 클래스를 알 수는 있지만, 실제 인스턴스를 접근하거나 값을 볼 수는 없다.

 

AGameMode

AGameModeBase의 파생 클래스로 멀티 플레이어 매칭과 관련된 함수를 제공한다. 새로 생성된 프로젝트는 AGameModeBase를 기본 클래스로 사용하지만 프로그래머가 직접 AGameMode를 상속하여 만든 클래스를 기본으로 설정할 수 있다.

게임 상태를 나타내는 State Machine를 포함하고 있으며 질의를 통해 상태를 알 수 있다.

  • EnteringMap : 초기 상태를 나타낸다. Actor들은 아직 Tick를 받지 않고 초기화 중인 상태를 의미한다.
  • WaitingToStart : HandleMatchIsWaitingToStart가 입장 시에 호출된다. Actor들은 Tick을 받고 있지만 플레이어가 아직 스폰되지는 않았다. StartMatch 혹은 ReadyToStartMatch가 true를 반환시 다음 상태로 진행된다.
  • InProgress : 게임의 대부분을 차지하는 일반적인 상태이다. HandleMatchHasStarted의 호출이 입장 시에 호출되면서 모든 Actor에 대해 BeginPlay가 호출된다. 이 시점에서 평범한 게임플레이가 진행된다. ReadyToEndMatch가 호출되어 true를 반환하거나 EndMatch가 호출될 때 다음상태로 진행된다.
  • WaitingPostMatch : 마지막에서 두번째 상태로 HandleMatchHasEnded가 입장 시에 호출된다. Actor들은 Tick을 받는 상태이며 새로운 플레이어가 입장할 수 없다. 맵이 시작할 때 다음 상태로 진행된다.
  • LeavingMap : 정상적인 마지막 흐름으로 HandleLeavingMap이 호출된다. 게임은 새로운 맵으로 입장중일 때 이 상태에 있으며 결국 EnteringMap으로 진행된다.
  • Aborted : 실패 상태이며 AbortMatch를 호출함으로써 발생한다. 만약 되돌이킬 수 없는 에러가 발생하면 설정된다.

 

Game Mode Blueprints

Game Mode 클래스들을 상속해서 현재 프로젝트나 레벨에서 기본 클래스를 변경할 수 있다.

  • Default Pawn Class
  • HUD Class
  • PlayerController Class
  • Spectator Class
  • Game State Class
  • Player State Class

 

Game State

Game State는 클라이언트가 게임의 상태를 확인할 수 있게 해야한다. 개념적으로 Game State는 모든 연결된 클라이언트에게 알려지는 Game Mode와 관련된 정보를 관리해야한다.

 

Game State는 한 플레이어가 얼마나 많은 깃발 점령에서 점수를 획득했는 지 등의 플레이어 정보를 추적하는 것이 아니라 게임 상황 중 계속 바뀌고 모든 플레이어에게 보여지는 속성들을 관리해야한다. Game Mode가 서버에서만 존재했다면, Game state는 서버에서도 존재하고 클라이언트에게도 복제되어 진다. 모든 연결된 상태가 게임 진행 중 최신이 되도록 유지한다.

 

AGameStateBase

AGameStateBase는 다음과 같은 함수 기능을 지닌다.

Functio or Variable Use
GetServerWorldTimeSeconds UWorld 클래스의 GetTImeSeconds의 서버 버전으로 클라이언트와 서버사이에 동기화가 된다.
PlayerArray APlayerState 오브젝트 배열로 한 게임에서 모든 플레이어게 무언가를 할 때 유용하다.
HasBegunPlay 게임에서 actors에 호출되는 BeginPlay가 호출되었다면 true를 반환한다.