본문 바로가기
Game Engines/언리얼 엔진

언리얼 C++ 게임 개발의 정석 | Chapter 04 게임플레이 프레임워크

by continue96 2022. 7. 16.

4장 게임플레이 프레임워크

4.1 게임 모드

 게임 규칙을 관리하는 게임 모드(GameMode)는 게임 플레이 중 다양한 사건이 발생할 때 게임 진행에 참고해야 할 핵심 요소이다. 게임 모드는 게임의 틀을 잡아주기도 하는데, 게임에 입장한 플레이어가 조종할 액터인 폰(Pawn)을 생성해 전달하는 역할도 한다.

 

4.1.1 게임 모드 제작 

 직접 게임 모드와 폰을 제작해보자. 파일 > 현재 레벨을 다른 이름으로 저장 메뉴를 눌러 작업 중인 Step1 레벨을 Step2 레벨로 변경한다.

그림 4-1 현재 레벨을 다른 이름으로 저장

 

 파일 > 새로운 C++ 클래스 메뉴를 누르고 GameModeBase 클래스를 상속받은 액터를 생성한다. 다음 버튼을 누르고 새로운 게임 모드의 이름을 ABGameMode로 정한다. 그리고 다시 언리얼 에디터로 돌아와 같은 메뉴에서 Pawn 클래스를 상속받은 ABPawn을 생성한다.

그림 4-2 게임 모드 ABGameMode 생성
그림 4-3 폰 ABPawn 생성

 

 이 게임 모드를 Step2 레벨에만 적용해본다. 툴바의 세팅 > 월드 세팅 메뉴를 누르고 GameMode 섹션에 있는 GameMode Override 항목에서 ABGameMode를 선택한다. 게임 모드를 변경하면 Step2 레벨에 등장하는 폰은 DefaultPawn이 되고 일인칭 시점으로 레벨을 탐험하게 된다.

그림 4-4 월드의 게임 모드 변경

 

 흰색 마네킹이 아닌 DefaultPawn이 생성된 것을 확인했다면 우리가 제작한 ABPawn이 생성되도록 게임 모드의 설정을 변경해본다.

/* Chapter 04 ABGameMode.h */
#pragma once
#include "ArenaBattle.h"
#include "GameFramework/GameModeBase.h"
#include "ABGameMode.generated.h"

UCLASS()
class ARENABATTLE_API AABGameMode : public AGameModeBase
{
	GENERATED_BODY()
	AABGameMode();
};

 게임 모드의 DefaultPawn 속성에 ABPawn의 클래스 정보를 지정한다. 언리얼 오브젝트의 클래스 정보는 자동으로 생성된 StaticClass 스태틱 함수를 호출해 가져올 수 있다.

/* Chapter 04 ABGameMode.cpp */
#include "ABGameMode.h"
#include "ABPawn.h"

AABGameMode::AABGameMode() {
	DefaultPawnClass = AABPawn::StaticClass();// 디폴트 폰 속성을 변경합니다.
}

 

4.2 플레이어의 입장

4.2.1 플레이어 컨트롤러

 게임 모드는 플레이어가 입장할 때 플레이어 컨트롤러(PlayerController)라는 액터로 함께 배정한다.

  • 플레이어 컨트롤러(player controller): 플레이어 컨트롤러는 게임 세계에서 플레이어와 소통하면서 폰을 조종하는 역할을 맡는다.
  • 폰(pawn): 폰은 플레이어 컨트롤러에게 조종당하는 액터이다. 폰은 게임 세계에서 실제로 보이고 레벨과 물리적으로 충돌한다.
  • 빙의(possess): 플레이어가 플레이어 컨트롤러를 통해 폰을 조종하는 행위를 말한다.

 언리얼 엔진에서 플레이 버튼을 눌러 플레이어가 입장하면 다음과 같은 순서로 액터가 생성된다.

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

 

 이 과정을 살펴보기 위해 파일 > 새로운 C++ 클래스 메뉴를 누르고 Player Controller 클래스를 상속받은 액터를 생성한다. 다음 버튼을 누르고 새로운 플레이어 컨트롤러의 이름을 ABPlayerController로 정한다.

그림 4-5 플레이어 컨트롤러 ABPlayerController 생성

 

 게임 모드의 생성자에서 PlayerController의 속성을 ABPlayerController의 클래스 값으로 변경한다.

/* Chapter 04 ABGameMode.cpp */
#include "ABGameMode.h"
#include "ABPawn.h"
#include "ABPlayerController.h"

AABGameMode::AABGameMode() {
	DefaultPawnClass = AABPawn::StaticClass();
	PlayerControllerClass = AABPlayerController::StaticClass();// 플레이어 컨트롤러 속성을 변경합니다.
}

 

 4.2.2 플레이어 초기화

 플레이어가 게임에 로그인(login)하면 게임 모드의 PostLogin 이벤트 함수가 호출되는데, 이 함수에서는 플레이어가 조종할 폰을 생성하고 플레이어 컨트롤러가 그 폰에 빙의하는 작업이 이루어진다.

/* Chapter 04 ABGameMode.h */
#pragma once
#include "ArenaBattle.h"
#include "GameFramework/GameModeBase.h"
#include "ABGameMode.generated.h"

UCLASS()
class ARENABATTLE_API AABGameMode : public AGameModeBase
{
	GENERATED_BODY()
	AABGameMode();
public:
	virtual void PostLogin(APlayerController* NewPlayer) override;// PostLogin 이벤트 함수를 선언합니다.
};
/* Chapter 04 ABGameMode.cpp */
#include "ABGameMode.h"
#include "ABPawn.h"
#include "ABPlayerController.h"

AABGameMode::AABGameMode() {
	DefaultPawnClass = AABPawn::StaticClass();
	PlayerControllerClass = AABPlayerController::StaticClass();
}

// PostLogin 이벤트 함수를 정의합니다.
void AABGameMode::PostLogin(APlayerController* NewPlayer) {
	ABLOG(Warning, TEXT("PostLogin Begin"));
	Super::PostLogin(NewPlayer);
	ABLOG(Warning, TEXT("PostLogin End"));
}

 

 로그를 확인하면 가장 먼저 플레이어 컨트롤러가 생성된다. 그리고 PostLogin Begin 로그 이후에 폰이 생성되고 이 폰에 플레이어 컨트롤러가 빙의한다. 마지막으로 PostLogin End 로그는 게임에 입장한 플레이어 세팅이 끝났다는 것을 의미한다.

그림 4-6 플레이어 초기화 결과

댓글