KoreanFoodie's Study

이득우의 언리얼 C++ 4 : 게임 모드(GameMode), 플레이어 컨트롤러(PlayerController) 제작 본문

Game Dev/Unreal C++ : Tutorial

이득우의 언리얼 C++ 4 : 게임 모드(GameMode), 플레이어 컨트롤러(PlayerController) 제작

GoldGiver 2022. 2. 21. 22:09

이득우님의 "이득우의 언리얼 C++ 게임 개발의 정석" 책을 따라가며 실습한 내용을 정리한 포스팅입니다. 실습에 필요한 자료들은 이 링크에서, 제가 작업한 예제 소스 완성본은 여기에서 찾아보실 수 있습니다. (저는 언리얼 4.27.2 버전 기준으로 작업하였습니다)

게임플레이 프레임워크

게임의 규칙을 관리하는 게임 모드와 플레이어가 조종하는 액터인 폰에 대해 알아보자.

프로젝트 세팅의 Selected GameMode 를 보면, Default Pawn Class 항목에서 게임에 입장한 플레이어에게 주어질 조종할 수 있는 액터, 폰의 타입을 지정할 수 있다.

 

언리얼 에디터에서 각각 GameMode, Pawn 을 상속받은 ABGameMode, ABPawn 을 생성하자.

그 후, 월드 세팅에서 GameMode Override 를 누른 후 ABGameMode 를 적용할 수 있다.

 

 

플레이어의 입장 - 플레이어 컨트롤러

플레이어가 입장하면 게임 모드는 플레이어에게 폰을 배정해 준다. 이때, 게임 모드는 플레이어 컨트롤러(PlayerController) 라는 특별한 액터도 함께 배정한다.

플레이어 컨트롤러는 게임 세계에서 현실 세계의 플레이어를 대변하는 무형의 액터이다. 플레이어가 입장할 때 배정되며 폰을 조종하는 역할을 맡는다. 배정된 플레이어 컨트롤러는 변경할 수 없다.

언리얼 엔진에서 플레이어가 플레이어 컨트롤러를 통해 폰을 조종하는 행위를 빙의(Possess) 라고 한다.

플레이 버튼을 눌러 플레이어가 입장하면 게임 모드에 의해 다음과 같은 순서로 액터들이 생성되고 게임 플레이를 위한 설정이 갖춰진다.

  1. 플레이어 컨트롤러의 생성
  2. 플레이어 폰의 생성
  3. 플레이어 컨트롤러가 플레이어 폰을 빙의
  4. 게임의 시작

플레이어가 로그인을 완료하면 게임 모드의 PostLogin 이벤트 함수가 호출되는데, 이 함수 내부에서 플레이어가 조종할 폰을 생성하고 플레이어 컨트롤러가 해당 폰에 빙의하는 작업이 이뤄진다. 폰과 플레이어 컨트롤러가 생성되는 시점은 각 액터의 PostInitializationComponents 함수로 파악할 수 있고, 빙의를 진행하는 시점은 플레이어 컨트롤러의 Possess, 폰의 PossessedBy 함수로 파악할 수 있다.

이제 로그를 찍은 코드를 보고 출력 결과를 파악해 보자.

 

ABGameMode.h

...
// 추가
virtual void PostLogin(APlayerController* NewPlayer) override;
...

 

ABGameMode.cpp

...
// 로그 찍기
void AABGameMode::PostLogin(APlayerController* NewPlayer)
{
	ABLOG(Warning, TEXT("PostLogin Begin"));
	Super::PostLogin(NewPlayer);
	ABLOG(Warning, TEXT("PostLogin End"));
}
...

 

ABPlayerController.h

#include "ArenaBattle.h"
...
virtual void PostInitializeComponents() override;
virtual void OnPossess(APawn* aPawn) override;

 

ABPlayerController.cpp

void AABPlayerController::PostInitializeComponents()
{
	Super::PostInitializeComponents();
	ABLOG_S(Warning);
}

void AABPlayerController::OnPossess(APawn* aPawn)
{
	ABLOG_S(Warning);
	Super::OnPossess(aPawn);
}

 

ABPawn.h

#include "ArenaBattle.h"
...
virtual void PostInitializeComponents() override;
virtual void PossessedBy(AController* NewController) override;

 

ABPawn.cpp

void AABPawn::PostInitializeComponents()
{
	Super::PostInitializeComponents();
	ABLOG_S(Warning);
}

void AABPawn::PossessedBy(AController* NewController)
{
	ABLOG_S(Warning);
	Super::PossessedBy(NewController);
}

 

로그를 보고 순서를 확인해 보자.

 

 

Auto Possess Player

폰의 Auto Possess Player 옵션을 사용하면 게임 모드는 ABPawn 액터를 생성하지 않고, 레벨에 배치된 해당 폰의 액터에 빙의하라는 명령을 내리게 만들 수 있다. (Player 0은 로컬 플레이어를 가리킴)

 

만약 C++ 로 생성된 액터가 아닌 블루프린트로 생성된 에셋를 사용하고자 한다면, 애셋 경로에 ' _C ' 를 붙여서 사용하면 된다. 다음은 기본 ThirdPersonCharacter 블루프린트를 사용하는 예제 코드이다.

static ConstructorHelpers::FClassFinder<APawn> BP_PAWN_C(TEXT("/Game/ThirdPersonCPP/Blueprints/ThirdPersonCharacter.ThirdPersonCharacter_C"));
if (BP_PAWN_C.Succeeded())
{
    DefaultPawnClass = BP_PAWN_C.Class;
}

 

Comments