게임 규칙을 지정하고 게임을 판정하는 최고 관리자 Actor
Unreal Engine에서 하나의 게임에는 반드시 하나의 GameMode만 존재한다.
MultiPlayer Game에서 판정을 처리하는 절대적 권위의 심판
게임 진행을 위한 event를 발생시키는 사물 Actor
주로 event 발생을 위한 collision 영역을 설정하는데, 이를 trigger라고 한다.
Trigger를 통해 character와 상호 작용하고, world에 actor를 spawn해 content를 전개한다.
게임에 입장한 사용자 Actor. 형태가 없다.
GameMode의 로그인을 통해 사용자가 GameWorld에 입장하면 player가 생성된다.
싱글 플레이 게임에는 0번 플레이어가 설정된다.
사용자와의 최종 communication을 담당한다.
무형의 Actor인 Player가 빙의(possess)해 조종하는 Actor
길찾기를 사용할 수 있으며, gimmick 및 다른 pawn과 상호작용한다.
Pawn 중에서 인간형 pawn을 별도로 character아고 지칭한다.
1단계 : World 설정과 GameMode 생성
2단계 : Player Pawn의 입출력 및 motion 설정
3단계 : Character에 반응하는 gimmick 설계
4단계 : 게임 데이터와 NPC 인공지능
5단계 : UI 연동 및 게임 제작 마무리
이번 강의에서는 GameMode
, PlayerController
, Character
를 생성해보자.
Character를 생성하는 것은 PC와 NPC를 만들 것이기 때문에 기본 CharacterBase 클래스와 이를 상속하는 CharacterPlayer 클래스를 만든다.
최종적으로 위와 같이 총 4개의 C++ Class를 생성.
새로운 맵 생성 + Player Start까지 배치
Player Start에서는 login한 player와 그 player가 빙의한 pawn이 이쪽에서 생성이 된다.
Build.cs에 경로를 지정해 주지 않으면 위와 같이 Compile 오류가 발생할 수 있기 때문에 조심할 것! 이때는 Editor를 끄고 Visual에서 전체 compile을 하자.
PublicIncludePaths.AddRange(new string[]{ "모듈 이름" });
헤더 경로를 찾기 쉽도록 module.Build.cs 파일에 위와 같이 모듈 경로를 추가해주자.
우리는 우리가 만든 custom gamemodebase인 RyanGameModeBase
에 DefaultPawnClass
, PlayerControllerClass
를 직접 만들어서 넣어볼 것이다.
World Setting의 Default GameMode. Third Person 패키지를 추가하였기 때문에 Default Pawn Class와 GameMode가 둘다 Third Person으로 설정되어 있는 것을 확인할 수 있다.
변경된 GameMode. 아직 Custom GameMode에 아무런 설정이 되어 있지 않아서 선택된 게임 모드
밑의 항목은 자동으로 설정되어 있는 것을 확인할 수 있다.
// Fill out your copyright notice in the Description page of Project Settings.
#include "Player/RyanPlayerController.h"
#include "Game/RyanGameModeBase.h"
ARyanGameModeBase::ARyanGameModeBase()
{
// GameMode에서는 DefaultPawnClass와 PlayerControllerClass에 대한 값을 설정을 해줄 것이다.
// "DefaultPawnClass"와 "PlayerControllerClass"는 각각 reserved된 변수들이기 때문에 따로 선언을 해줄 필요는 없다.
// PlayerControllerClass를 설정하는 방법1
// 사전에 만든 ARyanPlayerController을 StaticClass()로 접근.
PlayerControllerClass = ARyanPlayerController::StaticClass();
// PlayerControllerClass를 설정하는 방법2
// Header 통해서가 아닌, 바로 reference 주소를 통해 가져오기!
{
static ConstructorHelpers::FClassFinder<APlayerController> Asset(TEXT("/Script/ArenaBattle.RyanPlayerController"));
if (Asset.Class) {
PlayerControllerClass = Asset.Class;
}
}
// DefaultPawnClass에 대한 설정
// BP에서 FClassFinder를 통해 Class 정보를 가지고 올때는 뒤의 경로에다가 _C를 붙인다.
{
static ConstructorHelpers::FClassFinder<APawn> Asset(TEXT("/Game/ThirdPerson/Blueprints/BP_ThirdPersonCharacter.BP_ThirdPersonCharacter_C"));
if (Asset.Class) {
DefaultPawnClass = Asset.Class;
}
}
}
게임 플레이시 마우스를 화면에 숨기는 작업은 Controller 코드에서 이루어진다.
#include "Player/RyanPlayerController.h"
void ARyanPlayerController::BeginPlay()
{
// 게임이 시작될 때 마우스를 자동으로 ViewPort 상에 넣는 코드
// 마우스를 게임 도중에 보고 싶다면 shift + F1 키를 눌러서 나올 수 있다.
Super::BeginPlay();
if (APlayerController* PC = GetWorld()->GetFirstPlayerController())
{
FInputModeGameOnly GameOnlyInputMode;
PC->SetInputMode(GameOnlyInputMode);
}
}