프로젝트에서 아무것도 설정하지 않았다면 월드 세팅 Game Mode의 게임모드 오버라이드는 None으로 설정되어 있을 것이다.
이것을 C++ 클래스의 Game Mode Base를 만들어서 바꿔주면 GameMode의 속성들을 정의해서 사용할 수 있다.
MyActor를 만들었던 때 처럼 Pawn의 생성자를 선언 및 정의하고 MyGameModeBase에서 DefaultPawnClass를 해당 폰으로 지정해주면 실행 시 해당 폰으로 설정 및 기본 생성이 된다.
// MyPawn
AMyPawn::AMyPawn()
{
// Set this pawn to call Tick() every frame. You can turn this off to improve performance if you don't need it.
PrimaryActorTick.bCanEverTick = true;
Mesh = CreateDefaultSubobject<UStaticMeshComponent>(TEXT("MESH"));
Movement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("MOVEMENT"));
RootComponent = Mesh;
static ConstructorHelpers::FObjectFinder<UStaticMesh> SM(TEXT("StaticMesh'/Game/StarterContent/Props/SM_Couch.SM_Couch'"));
if (SM.Succeeded())
{
Mesh->SetStaticMesh(SM.Object);
}
}
// ---------------
#include "MyPawn.h"
// MyGameModeBase
AMyGameModeBase::AMyGameModeBase()
{
DefaultPawnClass = AMyPawn::StaticClass();
}
Pawn과 Actor의 다른점은 Pawn은 입력을 받을 수 있다. (빙의 가능)
Pawn 클래스에는 Actor와 다르게 입력에 대한 부분을 처리하는 SetupPlayerInputComponent 메소드가 기본적으로 포함되어있다.
void AMyPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
Super::SetupPlayerInputComponent(PlayerInputComponent);
PlayerInputComponent->BindAxis(TEXT("UpDown"), this, &AMyPawn::UpDown);
PlayerInputComponent->BindAxis(TEXT("LeftRight"), this, &AMyPawn::LeftRight);
// C#의 delegate 문법과 유사하다
}
UpDown과 LeftRight를 작성하고 해당 메소드도 클래스에 선언 및 정의해준다.
그리고 Text의 UpDown과 LeftRight는 그냥 적은게 아니고 엔진 세팅과 맞춰주어야 한다.
Tick에서 입력 받는거나 위의 함수에서 받는거나 어차피 매 틱마다 실행되는거면 무슨 차이가 있는건가? 싶을 수 있지만 차후 PlayerController에 이전시켜 줄 수도 있다. 그러면 위의 함수에 들어올것도 없이 PlayerControll에서 이벤트를 선점해서 그쪽에서 관리할 수도 있다.
아직은 무슨 얘기인지 잘 모르겠지만 그렇다고 한다.
입력과 별개로 이동에 관련된 부분은 또 다른 컴포넌트로 관리된다.
UPROPERTY(VisibleAnywhere)
class UFloatingPawnMovement* Movement;
// 해당 컴포넌트는 CoreMinimal 헤더에 포함되어있지 않기 때문에 헤더에서는 전방선언 해주고
// cpp파일에서 "GameFramework/FloatingPawnMovement.h" 를 포함시켜주면 사용할 수 있다
// ----
// 생성자
Movement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("MOVEMENT"));
이후에는 UpDown, LeftRight 메소드에서 해당 컴포넌트의 이동 메소드를 사용하면 된다.
void AMyPawn::UpDown(float Value)
{
UE_LOG(LogTemp, Warning, TEXT("UpDown %f"), Value)
AddMovementInput(GetActorForwardVector(), Value);
}
void AMyPawn::LeftRight(float Value)
{
UE_LOG(LogTemp, Warning, TEXT("LeftRight %f"), Value)
AddMovementInput(GetActorRightVector(), Value);
}
'언리얼 엔진 > 언리얼 엔진4 입문' 카테고리의 다른 글
[UE4 입문] 블루프린트 클래스 (0) | 2022.09.01 |
---|---|
[UE4 입문] 캐릭터 생성 (0) | 2022.09.01 |
[UE4 입문] 로그와 디버깅 (0) | 2022.09.01 |
[UE4 입문] 유니티 vs 언리얼 (0) | 2022.09.01 |
[UE4 입문] 언리얼 엔진 기초 (0) | 2022.09.01 |