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도 연결했다.
구현 결과
만족스럽게 나왔다.