본문 바로가기
언리얼 엔진/기초

[Unreal Engine5] Anim Instance 클래스로 걷기/점프 애니메이션 구현(1)

by TyT. 2023. 7. 23.
반응형

GitHub: https://github.com/tyt0815

 

tyt0815 - Overview

tyt0815 has 4 repositories available. Follow their code on GitHub.

github.com

Notion: https://www.notion.so/tyt0815/a16514d41cb240f08aa19fe5b4c0ab86?pvs=4 

 

언리얼 엔진

Unreal Engine 5 C++ The Ultimate Game Developer Course

www.notion.so

※노션에 기존에 작성하던 글이 있으니 참고

 

시작하기 앞서, 에픽게임즈에서 제공하는 무료 에셋에서 애니메이션 블루프린트를 참고하여 일부는 C++클래스로, 일부는  애니메이션 블루프린트로 만들었습니다.

Anim Instance 클래스

애니메이션 블루프린트를 바로 구현할 수 있지만, 커스텀을 용이하게 하기 위해 C++클래스로 만든 후 상속받아 사용하겠습니다.

먼저 애님 인스턴스 클래스를 상속받아 클래스를 하나 만들어 줍니다.

헤더파일에서 초기화 함수와 업데이트 함수(폰 클래스의 BeginPlay와 Tick에 대응되는 함수)를 오버라이드 해 줍니다. 그리고 캐릭터 클래스와 무브먼트 컴포넌트 클래스, 그리고 현재 속력변수를 선언해 줍니다.

public:
	virtual void NativeInitializeAnimation() override;
	virtual void NativeUpdateAnimation(float DeltaTime) override;
	bool IsMove();

	UPROPERTY(BlueprintReadOnly, Category = Movement)
	ABaseCharacter* NoTitleCharacter;

	UPROPERTY(BlueprintReadOnly, Category = Movement)
	UCharacterMovementComponent* NoTitleCharacterMovement;

	UPROPERTY(BlueprintReadOnly, Category = Movement)
	FVector Velocity;

	UPROPERTY(BlueprintReadOnly, Category = Movement)
	float GroundSpeed;

	UPROPERTY(BlueprintReadOnly, Category = Movement)	
	bool ShouldMove;

	UPROPERTY(BlueprintReadOnly, Category = Movement)
	bool IsFalling;

소스코드에서 함수들을 구현하고 변수들을 초기화 해 줍니다. 

항상 포인터를 사용할땐 nullptr인지 체크하고 사용합시다.

#include "Characters/NoTitleAnimInstance.h"
#include "Characters/BaseCharacter.h"
#include "GameFramework/CharacterMovementComponent.h"
#include "Kismet/KismetMathLibrary.h"


void UNoTitleAnimInstance::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();

	// 캐릭터 객체 초기화
	NoTitleCharacter = Cast<ABaseCharacter>(TryGetPawnOwner());
	if (NoTitleCharacter != nullptr)
	{
		// 캐릭터 무브먼트 컴포넌트 객체 초기화
		NoTitleCharacterMovement = NoTitleCharacter->GetCharacterMovement();
	}
}

void UNoTitleAnimInstance::NativeUpdateAnimation(float DeltaTime)
{
	Super::NativeUpdateAnimation(DeltaTime);

	if (NoTitleCharacterMovement != nullptr)
	{
		Velocity = NoTitleCharacterMovement->Velocity;
		GroundSpeed = UKismetMathLibrary::VSizeXY(Velocity);
		ShouldMove = IsMove();
		IsFalling = NoTitleCharacterMovement->IsFalling();
	}

}

bool UNoTitleAnimInstance::IsMove()
{
	if (NoTitleCharacterMovement == nullptr) { return false; }
	return GroundSpeed > 3.f && !NoTitleCharacterMovement->GetCurrentAcceleration().Equals(FVector::ZeroVector, 0);
}

 

컴파일하고 언리얼 편집기로 돌아와 이 클래스를 상속받는 애니메이션 블루프린트를 만들어 줍니다.

 

ABP 에디터를 열어주고 제일 먼저, 상속받은 변수를 표시하도록 해 줍니다.

이제 이 변수들로 애니메이션을 구현해 줍니다.

우선 대기(Idle)과 걷기/뛰기(Walk/Run) 입니다.

다음과 같이 스테이트 머신과 캐시포즈를 만들어 줍니다.

Locomotion 스테이트 머신에서 Idle 스테이트와 Walk/Run 스테이트를 만들어 서로 Transition으로 연결해 줍니다.

Idle 스테이트와 Walk/Run 스테이트를 구성해 줍니다.

시퀸스 플레이어는 우측 하단의 에셋브라우저에서 애니메이션을 드래그해 애니메이션 포즈 출력의 Result핀에 드랍하면 자동으로 생겨납니다.

여기서 블렌드 스페이스가 사용되었는데, 나중에 만들일이 있다면 그때 자세히 다루어 보겠습니다.

+ 깜박했는데, Idle과 Walk/Run은 루프를 하게 설정해야 애니메이션이 끝나지한고 계속해서 진행됩니다.

 

 

트랜지션 룰을 설정해 줍니다. 차례대로 Idle → Walk/Run, Walk/Run →Idle 입니다.

마지막으로 만들어진 로코모션 캐시 포즈를 연결해 줍니다.

미리 이야기 하자면 캐시포즈를 만드는 이유는 다음 포스트에서 점프를 구현할때 필요하기 때문 입니다.

컴파일하고 캐릭터 블루프린트에서 애니메이션을 설정합니다.

실행해서 확인해 봅니다.

 

다음 포스트에 이어서 점프/랜딩을 다루겠습니다.

반응형