본문 바로가기

언리얼엔진/c++클래스 만들어보기

UE5 C++클래스 Character상속

MyCharacter.cpp
0.00MB
MyCharacter.h
0.00MB
MyGameModeBase.cpp
0.00MB
MyGameModeBase.h
0.00MB

마켓플레이스에서 Paragon을 검색후 GreyStone을 구매후. Paragon:GreyStone

프로젝트에 추가해준다.

콘텐츠드로워에 다음 Meshes폴더에 Greystone을 Ctrl-C 해 놓는다.

C++ Class를 만드는데 부모 클래스는 Character로 하고 이름은 MyCharacter로 한다.

MyCharacter.h를 살펴보면 MyCharacter는 Character클래스로 부터 상속 받았다.

#include "CoreMinimal.h"
#include "GameFramework/Character.h"
#include "MyCharacter.generated.h"

UCLASS()
class TESTUNREALENGINE_API AMyCharacter : public ACharacter

Tick()과 SetupPlayerInputComponent()가 포함되어 있어 Pawn과 마찬가지고 Input을 받을 수 있다.

private로 카메라위치를 설정할 USpringArmComponent와 UCameraComponent를 추가해준다.

public:	
	// Called every frame
	virtual void Tick(float DeltaTime) override;

	// Called to bind functionality to input
	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

	void UpDown(float Value);
	void LeftRight(float Value);
	void Yaw(float Value);

private:
	UPROPERTY(VisibleAnywhere)
	class USpringArmComponent* SpringArm;

	UPROPERTY(VisibleAnywhere)
	class UCameraComponent* Camera;

MyCharacter.cpp를 열고 다음과 같이 헤더파일을 추가해준다.

#include "MyCharacter.h"
#include "GameFramework/SpringArmComponent.h"
#include "Camera/CameraComponent.h"
#include "Components/CapsuleComponent.h"

SppringArm Camera 컴포넌트를 생성해 포인터에 연결해준다.

캡슐컴포넌트를 SppringArm에 연결해주고 SpringArm을 Camera에 연결해준다.

SkeletalMesh포인터는 이미 정의되어 있기에 GetMesh()->를 이용해 ParagonGreystone을 연결만 해준다.

AMyCharacter::AMyCharacter()
{
 	// Set this character to call Tick() every frame.  You can turn this off to improve performance if you don't need it.
	PrimaryActorTick.bCanEverTick = true;

	SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SPRINGARM"));
	Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("CAMERA"));

	SpringArm->SetupAttachment(GetCapsuleComponent());
	Camera->SetupAttachment(SpringArm);

	SpringArm->TargetArmLength = 500.f;
	SpringArm->SetRelativeRotation(FRotator(-35.f, 0.f, 0.f));

	GetMesh()->SetRelativeLocationAndRotation(
		FVector(0.f, 0.f, -88.f), FRotator(0.f, -90.f, 0.f));

	static ConstructorHelpers::FObjectFinder<USkeletalMesh> SM(TEXT("SkeletalMesh'/Game/ParagonGreystone/Characters/Heroes/Greystone/Meshes/Greystone.Greystone'"));

	if (SM.Succeeded())
	{
		GetMesh()->SetSkeletalMesh(SM.Object);
	}
}

프로젝트세팅 Input TAB의 Bindings>AxisMappings에서 바인딩을 정의해주고

SetupPlayerInputComponent()에서 연결해준다. Pawn에서도 해주었다.

void AMyCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

	PlayerInputComponent->BindAxis(TEXT("UpDown"), this, &AMyCharacter::UpDown);
	PlayerInputComponent->BindAxis(TEXT("LeftRight"), this, &AMyCharacter::LeftRight);
	PlayerInputComponent->BindAxis(TEXT("Yaw"), this, &AMyCharacter::Yaw);
}

Input Event()를 설정해준다. 새로 추가된 Yaw()는 ThirdPersonCharacter처럼 마우스를 좌우로 움직이면 Character의 바디가 회전한다.

void AMyCharacter::UpDown(float Value)
{
	if (Value == 0.f)
		return;

	//UE_LOG(LogTemp, Warning, TEXT("UpDown %f"), Value);
	AddMovementInput(GetActorForwardVector(), Value);
}

void AMyCharacter::LeftRight(float Value)
{
	if (Value == 0.f)
		return;

	//UE_LOG(LogTemp, Warning, TEXT("LeftRight %f"), Value);
	AddMovementInput(GetActorRightVector(), Value);
}

void AMyCharacter::Yaw(float Value)
{
	AddControllerYawInput(Value);
}

C++클래스를 GameModeBase를 부모로 만든다.

MyGameModeBase.h

생성자를 선언해준다.

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/GameModeBase.h"
#include "MyGameModeBase.generated.h"

UCLASS()
class TESTUNREALENGINE_API AMyGameModeBase : public AGameModeBase
{
	GENERATED_BODY()

	AMyGameModeBase();
};

MyGameModeBase.cpp

 

DefaultPawnClass를 지정해줘 빙의시켜 입력을 받게해준다.  주석처리한 부분은 C++클래스대신 BluePrint를 선택할 경우이다.  BluePrint만드는 법은 아래에서 설명한다.

#include "MyGameModeBase.h"
#include "MyCharacter.h"

AMyGameModeBase::AMyGameModeBase()
{
	DefaultPawnClass = AMyCharacter::StaticClass();
/* for BluePrint
	static ConstructorHelpers::FClassFinder<ACharacter> BP_Char(TEXT("Blueprint'/Game/Blueprints/BP_MyCharacter.BP_MyCharacter_C'"));
	if (BP_Char.Succeeded())
	{
		DefaultPawnClass = BP_Char.Class;
	}
*/
}

New Level을 하나 만들과 다음과 같이 배치해준다. 적당해해도 되는데 카메라가 없다. 카메라는 Character에 포함시킬것이다.

저장하고 이름을 Default Map으로 하고 프로젝트세팅에 StartUp Map, Default Map으로하고 라이브코딩후 생겨난 C++클래스중 MyGameModeBase를 Default GameMode로 지정한다.

플레이 해보면 파라곤이 나타난다. MyCharactor0를 보면 Capsule, Mesh가 기본적으로 추가되어 있고 추가해준 SpringArm에 Camera가 달려 있다. WASD로 움직일수 있고 마우스로 캐릭터를 좌우로 회전시킬수 있다.

이런걸 직접구현하는게 재미있다. 다 만들어진걸 쓰면 편하긴 한다. 외어야할게 많다. ㅎㅎ

참고로 C++클래스 대신 블루프린트로 캐릭터를 만들고 GameModeBase.cpp에서 선택할수 있는데 그경우 블루프린트다.

재미있는건 움직임을 Tick()에서 구현 안하고 InputAxis이벤트를 이용 AddMovement Input로 넘겨주었다는 거다.

이 블루프린트는 당연히 다음과 같이 컴포넌트들을 포함시켜줘야 한다.

'언리얼엔진 > c++클래스 만들어보기' 카테고리의 다른 글

UE5 ENHANCED Input 연습2  (0) 2023.10.18
EnhancedInput 연습  (1) 2023.10.17
MyPawn에서 키입력 받기  (0) 2023.10.16
UE5 GameModeBase  (0) 2023.10.15
UE5 빌드 환경 설정 및 컴파일 방법  (0) 2023.10.14