Unreal 엔진

[이득우의 언리얼 C++] 4장, 게임플레이 프레임워크

원소랑 2019. 12. 22. 19:25

.

4장, 게임 플레이와 프레임워크에 대한 내용을 읽고 요약 메모한 내용을 옮겨봅니다.

게임모드, 플레이어컨트롤러, 폰 액터에 대한 개념들을 다룹니다.


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

언리얼 엔진에서 게임이 시작되려면

게임의 규칙, 입장 플레이어, 플레이어 조종 액터.

각각, 게임모드, 플레이어 컨트롤러, 폰

위 세 가지 액터를 직접 제작하고 동작하는지 학습.

게임모드

레벨을 구성하는 작업, 게임플레이 설계하는 작업.

게임 플레이 프레임워크는 다양한 게임 요소를 수용할 수 있도록 복잡하고 방대함.

먼저 핵심 두 가지, 게임 규칙을 관리하는 게임 모드, 플레이어가 조종하는 액터인 폰.

언리얼 엔진의 게임 모드.

게임의 틀을 잡아주는 역할. 플레이어가 입장할 때마다 플레이어 점검. 조종할 액터(폰:Pawn)를 생성해 전달. 샘플 예제의 흰색 마네킹 액터가 폰.

Edit > Project Settings 에서 Default Maps 수정.

Defaults Modes 의 Selected GameMode 를 펼치면 Default Pawn Class 항목 확인.

게임 모드를 C++ 로 직접 생성

GameModeBase 를 상속받는 MyGameMode 클래스 생성.

Pawn 클래스를 상속받는 MyPawn 클래스 생성.

월드 셋팅에서 GameMode Override 항목에 MyGameMode 클래스 셋팅.

MyGameMode 클래스의 생성자에서 DefaultPawnClass 참조를 MyPawn 으로 변경해서 기본 Pawn 을 변경

MyGameMode::MyGameMode()

{

DefaultPawnClass = MyPawn::StaticClass();

}

플레이어 컨트롤러도 할당 해줘야 함.

플레이어 > 컨트롤러 > 폰(액터)

https://docs.unrealengine.com/ko/Gameplay/Framework/Controller/PlayerController/index.html

 

플레이어 컨트롤러

PlayerController 는 플레이어에게 받은 입력을 이동, 아이템 사용, 무기 발사와 같은 동작으로 변환하는 함수성을 구현합니다.

docs.unrealengine.com

폰은 컨트롤러에게 조종당하는 액터. 플레이어는 컨트롤러를 통해, 폰을 갈아탈 수도 있다.

빙의(Possess) = 플레이어 컨트롤러를 통해 폰을 조종하는 행위.

언리얼 에디터의 “플레이”버튼 누름은 플레이어 입장과 같다. 그 순서.

1. 플레이어 컨트롤러 생성

2. 폰 생성

3. 컨트롤러가 폰에 빙의

4. 게임 시작

PlayerController 상속받는 MyPlayerController 클래스 생성.

MyGameMode::MyGameMode()

{

DefaultPawnClass = MyPawn::StaticClass(); // 복붙

PlayerControllerClass = MyPlayerController::StaticClass(); // 이렇게 할당.

}

월드 셋팅에서 GameMode > SelectedGameMode 하위의 PlayerContoller Class 가 변경된 것 확인.

UE에서 플레이어 입장을 Logn 이라고 부름. PostLogin 이벤트 함수 호출. 여기서 폰을 생성, 컨트롤러 빙의 작업.

폰과 컨트롤러가 생성되는 시점

PostInitializeComponents() 호출 시점.

빙의 시점은

~Controller::Possess()

~Pawn::PossessedBy()

위 함수로 파악.

게임모드에서 PostLogin(APlayerController* controller) override; 함수를 추가해서 로그를 찍어서 파악 가능.

게임모드, 컨트롤러, 폰 모두 로그를 추가해서, 초기화 되는 순서를 추적해본다.

로그 확인

1. 플레이어 컨트롤러 생성

2. PostLogin Begin

3. 폰 생성

4. 빙의(Possess)

5. PostLogin End

몇 명이 들어올지 모르는 멀티 플레이 게임에 적합 할 수 있음. 예외적으로 폰에 Auto Possess Player 속성으로 폰을 새로 생성하지 않고 레벨에 배치돼있는 폰에 플레이어 컨트롤러 빙의 가능.

ThirdPersonBP 에서 ThirdPersonCharacter 를 레벨에 배치, 디테일 윈도우 Auto Possess Player 를 Player 0 으로 설정. Player 0은 로컬 플레이어를 의미.

플레이 하면 게임 모드는 ABPawn 액터 생성하지 않고, 대신 플레이어 컨트롤러에게 배치된 마네킹 액터 빙의 명령을 내림.

C++ 폰 말고 블루프린트 폰을 기본 폰으로 셋팅도 가능.

ConstructorHelpers::FClassFinder<> 로 “~_C” 경로를 입력하면 블루프린트 에셋이 클래스 정보 가져올 수 있음.

MyGameMode::MyGameMode()

{

DefaultPawnClass = MyPawn::StaticClass(); // 복붙

PlayerControllerClass = MyPlayerController::StaticClass(); // 복붙

static ConstructorHelpers::FClassFinder<APawn> BP_PAWN_C( TEXT(

“/Game/ThirdPersonBP/Blueprints/ThirdPersonCharacter.ThirdPersonCharacter_C”)); // _C 경로

if ( BP_PAWN_C.Succeeded() )

{

DefaultPawnClass = BP_PAWN_C.Class;

}

}

블루프린트의 클래스 정보도 위와 같이 가져오도록 하면, 월드 셋팅의 Default Pawn Class 를 변경 가능.

.

.

.

728x90
반응형