본문 바로가기
언리얼 최고/언리얼 c++

이득우의 언리얼 C++ 정리 - 5 (폰의 제작과 조작)

by Lee_story_.. 2022. 8. 19.
728x90

 

*  아래의 책의 내용을 정리한 글입니다!  *

 

 

이번장에서는 폰을 조작하는 방법에 대한 내용이였습니다.

 

그럼 시작!

 

 

폰에도 기본적인 구성요소가 있습니다!

-  먼저 그 요소들에 대해서 정리하면                                                                                   

  • 시각적 요소 : 눈에 보이는 메시가 필요 , 주로 스태틱매시
  • 충돌 요소 : 충돌을 만들어 주기 위해 캡슐 컴포넌트를 사용한다.
  • 움직임 요소 : 기본적으로 폰 무브먼트 컴포넌트(FloatingPawnMovement 또는 CharacterMovement)를 제공한다.
  • 네비게이션(Navigation) : 폰은 언리얼 엔진의 네비게이션 시스템과 연동돼 있어서 목적지를 알려주면 스스로 목적지까지 이동하는 길 찾기 기능을 갖고 있다!
  • 카메라 출력 : 폰에 카메라 컴포넌트를 부착하면, 플레이어 컨트롤러가 폰에 빙의할 때 자동으로 폰에 부착된 카메라의 상을 플레이어의 화면으로 전송해줌!

 

먼저! 간단한 애니메이션 하나 만들고 가죠! (밑에서 사용합니다!)

 

 

 

 

 

이제 전에 만들어 두었던 ABPawn.h , ABPawn.cpp 파일을 수정해줍시다.

 

ABPawn.h에 여러 요소와 움직임을 위한 매크로를 만들어줍시다.

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "ArenaBattle.h"
#include "GameFramework/Pawn.h"
#include "GameFramework/FloatingPawnMovement.h" // 추가!
#include "ABPawn.generated.h"

UCLASS()
class ARENABATTLE_API AABPawn : public APawn {
	GENERATED_BODY()

public:
	// Sets default values for this pawn's properties
	AABPawn();

protected:
	// Called when the game starts or when spawned
	virtual void BeginPlay() override;

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

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

	virtual void PostInitializeComponents() override;
	virtual void PossessedBy(AController* NewController) override;

	UPROPERTY(VisibleAnywhere, Category = Collision)//캡슐
		UCapsuleComponent* Capsule;

	UPROPERTY(VisibleAnywhere, Category = Visual)//메시!
		USkeletalMeshComponent* Mesh;

	UPROPERTY(VisibleAnywhere, Category = Movement)//움직임
		UFloatingPawnMovement* Movement;

	UPROPERTY(VisibleAnywhere, Category = Camera)//카메라 봉? 비슷
		USpringArmComponent* SpringArm;

	UPROPERTY(VisibleAnywhere, Category = Camera)//카메라
		UCameraComponent* Camera;

private:
	void UpDown(float NewAxisValue);

	void LeftRight(float NewAxisValue);

};

 

ABPawn.cpp

// Fill out your copyright notice in the Description page of Project Settings.


#include "ABPawn.h"

// Sets default values
AABPawn::AABPawn()
{
 	// 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;
	//요소들 선언
	Capsule = CreateDefaultSubobject<UCapsuleComponent>(TEXT("CAPSULE"));
	Mesh = CreateDefaultSubobject<USkeletalMeshComponent>(TEXT("MESH"));
	Movement = CreateDefaultSubobject<UFloatingPawnMovement>(TEXT("MOVEMENT"));
	SpringArm = CreateDefaultSubobject<USpringArmComponent>(TEXT("SPRINGARM"));
	Camera = CreateDefaultSubobject<UCameraComponent>(TEXT("CAMERA"));

	RootComponent = Capsule;
	Mesh->SetupAttachment(Capsule);
	SpringArm->SetupAttachment(Capsule);
	Camera->SetupAttachment(SpringArm);
	//요소들 값 설정
	Capsule->SetCapsuleHalfHeight(88.0f);
	Capsule->SetCapsuleRadius(34.0f);
	Mesh->SetRelativeLocationAndRotation(FVector(0.0f, 0.0f, -88.0f), FRotator(0.0f, -90.0f, 0.0f));
	SpringArm->TargetArmLength = 400.0f;
	SpringArm->SetRelativeRotation(FRotator(-15.0f, 0.0f, 0.0f));
	
	static ConstructorHelpers::FObjectFinder<USkeletalMesh> SK_CARDBOARD(TEXT("/Game/InfinityBladeWarriors/Character/CompleteCharacters/SK_CharM_Golden.SK_CharM_Golden"));
	if (SK_CARDBOARD.Succeeded())//매시설정
	{
		Mesh->SetSkeletalMesh(SK_CARDBOARD.Object);
	}
	Mesh->SetAnimationMode(EAnimationMode::AnimationBlueprint);

	static ConstructorHelpers::FClassFinder<UAnimInstance> WARRIOR_ANIM(TEXT("/Game/InfinityBladeWarriors/Animation/WarriotAnimBluePrint.WarriotAnimBluePrint_C"));// 블루프린트라서 _C 사용!
	if (WARRIOR_ANIM.Succeeded())// 애니메이션 설정
	{
		Mesh->SetAnimInstanceClass(WARRIOR_ANIM.Class);
	}
}

// Called when the game starts or when spawned
void AABPawn::BeginPlay()
{
	Super::BeginPlay();
}
// Called every frame
void AABPawn::Tick(float DeltaTime)
{
	Super::Tick(DeltaTime);
}

// Called to bind functionality to input
void AABPawn::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
	Super::SetupPlayerInputComponent(PlayerInputComponent);

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

void AABPawn::UpDown(float NewAxisValue)//상하 이동
{
	AddMovementInput(GetActorForwardVector(), NewAxisValue);
}

void AABPawn::LeftRight(float NewAxisValue)//좌우 이동
{
	ABLOG(Warning, TEXT("%f"), NewAxisValue);
	AddMovementInput(GetActorRightVector(), NewAxisValue);
}

 

 

 

여기서 중요한거 하나!

PlayerInputComponent >> 키보드의 입력을 받아 값을 설정해주는 것으로 

프로젝트 세팅 >> 입력에 가면 이미 정의 되어있는것들도 있고 추가도 가능합니다!

 

위처럼 코드를 고쳤을때 캐릭터가 이동하는지 확인해봅시다!

 

 

 

5장은 폰을 가지고 모든 요소를 설정하는 부분이라 빨리끝났네요! 

 

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글