[이득우의 언리얼 C++] 4장, 게임플레이 프레임워크
.
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
폰은 컨트롤러에게 조종당하는 액터. 플레이어는 컨트롤러를 통해, 폰을 갈아탈 수도 있다.
빙의(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 를 변경 가능.
.
.
.