프로젝트에서 아무것도 설정하지 않았다면 월드 세팅 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);
}

+ Recent posts