본문 바로가기
Unreal/Manual

Unreal C++ 기본 캐릭터 움직임, 설정 구현

by Dev_카페인 2023. 11. 22.
반응형

[Unreal/C++] 기본 캐릭터 움직임, 설정 구현

 

캐릭터에

1. SpringArmComponent, CameraComponent를 추가한다.

2. SkeletalMesh를 변경한다.

3. 키보드의 W, S, A, D키를 받아 X, Y축 이동을 구현한다.

4. 마우스의 움직임을 받아 카메라의 X,Y 축 회전을 구현한다.

 

먼저 캐릭터를 상속받는 클래스를 만든다.

 

 

생성시 기본 형태는 생성자와 BeginPlay, Tick, SetupPlayerInputComponent 함수가 있습니다.

하단에 입력을 받을 함수와 컴포넌트 변수를 선언해줍니다.

// MyCharacter.h

#pragma once

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

UCLASS()
class MAINPROJECT_API ADefaultCharacter : public ACharacter
{
	GENERATED_BODY()

public:
	ADefaultCharacter();

protected:
	virtual void BeginPlay() override;

public:	
	virtual void Tick(float DeltaTime) override;

	virtual void SetupPlayerInputComponent(class UInputComponent* PlayerInputComponent) override;

private :
	void OnMoveForward(float Axis);
	void OnMoveRight(float Axis);
	void OnHorizontalLook(float Axis);
	void OnVerticalLook(float Axis);

private :
	UPROPERTY(VisibleDefaultsOnly)
		class USpringArmComponent* SpringArm;

	UPROPERTY(VisibleDefaultsOnly)
		class UCameraComponent* Camera;
};

 

이후 cpp 생성자에서 SpringArm과 Camera를 추가, 설정해줍니다.

mesh는 SkeletalMesh의 레퍼런스 경로를 복사하여 붙여줍니다.

// 생성자 코드

ADefaultCharacter::ADefaultCharacter()
{
	PrimaryActorTick.bCanEverTick = true;	// 틱을 사용

	// SpringArm과 Camera를 추가
    // CreateDefaultSubobject는 생성자에서만 사용이 가능합니다.
	SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SpringArm"));
	Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("Camera"));

	// SpringArm을 루트 컴포넌트 하위 자식으로 붙여줍니다.
    // Camera는 SpringArm컴포넌트 하위로 붙여줍니다.
	SpringArm->SetupAttachment(RootComponent);
	Camera->SetupAttachment(SpringArm);

	// SpringArm의 거리를 조정하고, Pawn컨트롤러의 회전을 사용합니다.
	SpringArm->TargetArmLength = 500.0f;
	SpringArm->bUsePawnControlRotation = true;
    
    // ContructorHelpers또한 생성자에서만 사용 가능합니다.
    // SkeletalMesh Object를 찾아 mesh에 넣습니다.
	ConstructorHelpers::FObjectFinder<USkeletalMesh> mesh(L"SkeletalMesh'/Game/Characters/TwinBlast/Meshes/TwinBlast_ShadowOps.TwinBlast_ShadowOps'");
	verifyf(mesh.Succeeded(), L"mesh.succeeded()");
    // mesh를 가져와서 설정해줍니다.
	GetMesh()->SetSkeletalMesh(mesh.Object);
    // 블루프린트로 캐릭터를 추가해보셨다면 알겠지만 캐릭터의 위치와 회전을 설정해줍니다.
	GetMesh()->SetRelativeLocation(FVector(0, 0, -90));
	GetMesh()->SetRelativeRotation(FRotator(0, -90, 0));
}

 

키보드와 마우스의 입력을 받기 위해 SetupPlayerInputComponent에 코드를 추가합니다.

 

// MyCharacter.cpp

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

	// 프로젝트 셋팅 -> 입력에서 추가한 축 이름과 호출될 함수를 설정합니다.
	PlayerInputComponent->BindAxis("MoveForward", this, &ADefaultCharacter::OnMoveForward);
	PlayerInputComponent->BindAxis("MoveRight", this, &ADefaultCharacter::OnMoveRight);
	PlayerInputComponent->BindAxis("HorizontalLook", this, &ADefaultCharacter::OnHorizontalLook);
	PlayerInputComponent->BindAxis("VerticalLook", this, &ADefaultCharacter::OnVerticalLook);
}
// MyCharacter.cpp
// 헤더에 추가했던 함수를 구현해줍니다.

void ADefaultCharacter::OnMoveForward(float Axis)
{
	FRotator rotator = FRotator(0, GetControlRotation().Yaw, 0);
	FVector direction = FQuat(rotator).GetForwardVector().GetSafeNormal2D();

	AddMovementInput(direction, Axis);
}

void ADefaultCharacter::OnMoveRight(float Axis)
{
	FRotator rotator = FRotator(0, GetControlRotation().Yaw, 0);
	FVector direction = FQuat(rotator).GetRightVector().GetSafeNormal2D();

	AddMovementInput(direction, Axis);
}

void ADefaultCharacter::OnHorizontalLook(float Axis)
{
	AddControllerYawInput(Axis);
}

void ADefaultCharacter::OnVerticalLook(float Axis)
{
	AddControllerPitchInput(Axis);
}

 

 

 

플레이어 입력 설정하기

편집->프로젝트셋팅->엔진->입력->축매핑 +버튼을 눌러 추가

축 매핑 이름은 Input 연결에 사용됩니다.

 

 

 

Skeletal Mesh 레퍼런스 경로 복사

Skeletal Mesh를 찾아 우클릭->레퍼런스 복사

 

 

반응형