Unreal

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

푸쿠이 2021. 5. 28. 17:15
점프 판정을 맡을 변수 만들기

애니메이션을 담당하고 있는 PlayerAnim 클래스에 bIsInAir 변수를 선언한다.

#pragma once

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

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

private:
	ACharacter* Character;
};

 

이전 글에서 캐릭터 이동 애니메이션을 만들 때는 Tick마다 Character를 가져왔는데,

이번에는 BeginPlay()에서 변수로 저장한 뒤에 사용했다.

#include "PlayerAnim.h"
#include "Player_Base.h"
#include "GameFramework/CharacterMovementComponent.h"

UPlayerAnim::UPlayerAnim()
{
	bIsInAir = false;
}

void UPlayerAnim::NativeBeginPlay()
{
	Super::NativeBeginPlay();

	APawn* Pawn = TryGetPawnOwner();
	if (::IsValid(Pawn))
	{
		Character = Cast<ACharacter>(Pawn);
	}
}

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

	if (Character == nullptr)
	{
		return;
	}

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

	bIsInAir = Character->GetCharacterMovement()->IsFalling();
}

 

애님 그래프에서 연결하기

스테이트 머신을 만든다.

스테이트 머신 안에 내용을 이렇게 구현한다.

한 눈에 보이는 게 아니라 설명하기가 힘들어서 이미지로 만들었다.

 

JumpLoop 애니메이션은 Loop 기능이 체크가 되어있어야 한다.

Time Remaining은 애니메이션의 남은 시간을 알려준다. ratio이기 때문에 비율로 알려준다.

ratio < 0.1 의미는 '애니메이션의 진행 상황이 90퍼가 넘었으면' 이다.

+ 추가

점프를 하자마자 땅에 닿는 경우일 때는 어색할 수가 있어서 JumpStart->JumpEnd도 연결했다.

 

구현 결과

만족스럽게 나왔다.