Unreal

[Unreal C++] 캐릭터 이동 애니메이션 구현하기

푸쿠이 2021. 5. 28. 00:42
캐릭터에 애니메이션 블루프린트 연결하기

AnimInstance 클래스를 상속받는 PlayerAnim 클래스를 생성한다.

NativeUpdateAnimation 함수에서 캐릭터의 속력, 방향 값을 계속 업데이트해준다.

#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimInstance.h"
#include "PlayerAnim.generated.h"

UCLASS()
class MYRPG_API UPlayerAnim : public UAnimInstance
{
	GENERATED_BODY()
	
public:
	virtual void NativeUpdateAnimation(float DeltaSeconds) override;
	
public:
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
	float Speed;

	UPROPERTY(VisibleAnywhere, BlueprintReadOnly)
	float Direction;
};
#include "PlayerAnim.h"

void UPlayerAnim::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);

	APawn* Pawn = TryGetPawnOwner();
	if (!::IsValid(Pawn)) return;

	Speed = Pawn->GetVelocity().Size();
	Direction = CalculateDirection(Pawn->GetVelocity(), Pawn->GetActorRotation());
}

 

PlayerAnim 클래스를 상속받는 애니메이션 블루프린트(BP_PlayerAnim)를 생성한다.

캐릭터 클래스에서 BP_PlayerAnim을 연결시켜준다.

// 캐릭터 클래스 생성자에 추가한 코드.
static ConstructorHelpers::FClassFinder<UAnimInstance> ABP_Player(TEXT("AnimBlueprint'/Game/Blueprints/Player/BP_PlayerAnim.BP_PlayerAnim_C'"));
if (ABP_Player.Succeeded())
{
	GetMesh()->SetAnimInstanceClass(ABP_Player.Class);
}

 

블렌드 스페이스 사용하기

내가 가지고 있는 캐릭터 에셋의 애니메이션 종류는 이렇다.

 

가만히 서 있는 애니메이션 (Idle)

4방향으로 걷는 애니메이션 (WalkForward, Backward, Left, Right)

2방향으로 뛰는 애니메이션 (RunForward, Backward)

 

RunLeft, RunRight 애니메이션이 없어서,

WalkLeft, WalkRight 애니메이션을 복사한 후, Rate Scale 값을 2로 해서 대체했다. (2배속)

 

여러 애니메이션들을 부드럽게 이어주기 위해, 블렌드 스페이스(BS_IdleWalkRun)를 생성한다.

가로 축은 Direction (-180 ~ 180), 세로 축은 Speed (0 ~ 600) 이다.

이렇게 애니메이션들을 배치했다.

BP_PlayerAnim에서 상속된 변수 표시를 누르면, 부모 클래스(PlayerAnim)에서 선언했던 변수들이 보일 것이다.

방금 만든 블렌드 스페이스를 연결해준다.

 

구현 결과

4방향 애니메이션은 원래 있었고, 대각선 애니메이션은 블렌드 스페이스 덕분이다.

만족스럽게 잘 동작한다.