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장은 폰을 가지고 모든 요소를 설정하는 부분이라 빨리끝났네요!
틀린점이 있다면 댓 달아주세요!
'언리얼 최고 > 언리얼 c++' 카테고리의 다른 글
이득우의 언리얼 C++ 정리 - 7 (애니메이션 시스템의 설계) (0) | 2022.08.20 |
---|---|
이득우의 언리얼 C++ 정리 - 6 (캐릭터의 제작과 컨트롤) (0) | 2022.08.20 |
이득우의 언리얼 C++ 정리 - 4 (게임플레이 프레임워크) (0) | 2022.08.17 |
언리얼 C++ 액터 삭제에 대해서! (0) | 2022.08.17 |
이득우의 언리얼 C++ 정리 - 3 (로깅 + 움직이는 액터) (0) | 2022.08.16 |
댓글