본문 바로가기
언리얼 최고/언리얼 c++

이득우의 언리얼 C++ 정리 - 7 (애니메이션 시스템의 설계)

by Lee_story_.. 2022. 8. 20.
728x90

 

 

*  아래의 책의 내용을 정리한 글입니다!  *

 

이번에는 지난번에 간단히 만들었던 애니메이션을 좀더 배워보는 장입니다!

 

 

시작!

 

먼저 애니메이션의 두 가지 구성 요소!

  • 애님 인스턴스: 스켈레탈 메시를 소유하는 폰의 정보를 받아 애님 그래프가 참조할 데이터를 제공한다. 블루프린트와 C++ 로 제작할 수 있다.
  • 애님 그래프: 애님 인스턴스의 변수 값에 따라 변화하는 애니메이션 시스템을 설계하는 공간이다. 블루프린트로만 제작할 수 있다.

 

애님 인스턴스부터 만들어 봅시다.

 

이렇게 따로 만들어주고

 

ABAnimInstance.h 파일

#pragma once

#include "ArenaBattle.h"
#include "Animation/AnimInstance.h"
#include "ABAnimInstance.generated.h"

/**
 *
 */
UCLASS()
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
	GENERATED_BODY()

public:
	UABAnimInstance();

private:
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
		float CurrentPawnSpeed;


	// BlueprintReadOnly - 블루프린트에서 값만 읽어 오기위한 특성!
};

 

 

ABAnimInstance. cpp 파일

#include "ABAnimInstance.h"

UABAnimInstance::UABAnimInstance()
{
	CurrentPawnSpeed = 0.0f;
}

 

그러고 나서 전에 만들어 뒀던 애님 블프의 클래스 옵션에 방금만든 클래스를 넣어줍시다.

 

그리고 컴파일 한번해주고

 

밑의 사진에서 눈모양을 누른뒤 상속변수표시를 눌러, 변수를 불러옵시다.

 

 

그다음 애님 그래프에 아래같이 만들어줍시다.

 

우측하단에 프리뷰 에디터도 사용해봅시다(애니메이션 시험용!)

 

 

 

이제 캐릭터에서 CurrentPawnSpeed을 직접 받아오는 함수도 만들어 줍시다.

 

 

ABAnimInstance.h 파일에 추가

public:
	virtual void NativeUpdateAnimation(float DeltaSeconds) override;

 

ABAnimInstance. cpp 파일에 추가

void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)// 현재 플레이중인 폰으로 부터 데이터를 받아오는 함수
{
	Super::NativeUpdateAnimation(DeltaSeconds);

	auto Pawn = TryGetPawnOwner();//현재 폰을 받고
	if (::IsValid(Pawn))
	{
		CurrentPawnSpeed = Pawn->GetVelocity().Size();// 이동속도 받기
		
	}
}

 

이제 점프 애니메이션도 구현해보도록 하죠!

 

기본적인 움직임에 대해서 폰의 무브먼트 컴포넌트가 제공하는 함수들을 사용하는데 대표적인 4가지!

  • IsFalling( ) : 공중에 떠 있는지 알려줌
  • IsSwimming( ) : 수영 중인지 알려줌
  • IsCrouching( ) : (쭈그리고) 앉아있는지 알려줌
  • IsMoveOnGround( ) : 땅 위에서 이동 중인지 알려줌

여기서 점프는 IsFalling()을 사용할것입니다!

 

하지만 그전에 점프 버튼을 만들어야죠

ABCharacter.cpp 파일에 추가

AABCharacter::AABCharacter(){
//~
    GetCharacterMovement()->JumpZVelocity = 800.0f;
//~
}

//~
void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent){
    PlayerInputComponent->BindAction(TEXT("Jump"), EInputEvent::IE_Pressed, this, &AABCharacter::Jump);// 점프

 

 

그 다음은 애니메이션!

 

ABAnimInstance.h 파일에 추가

private:
        UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Pawn, Meta = (AllowPrivateAccess = true))
		bool IsInAir;

 

ABAnimInstance. cpp 파일에서 함수 수정!

void UABAnimInstance::NativeUpdateAnimation(float DeltaSeconds)// 현재 플레이중인 폰으로 부터 데이터를 받아오는 함수
{
	Super::NativeUpdateAnimation(DeltaSeconds);

	auto Pawn = TryGetPawnOwner();
	if (::IsValid(Pawn))
	{
		CurrentPawnSpeed = Pawn->GetVelocity().Size();
		auto Character = Cast<ACharacter>(Pawn);
		if (Character)
		{
			IsInAir = Character->GetMovementComponent()->IsFalling();
		}
	}
}

 

이제 애님 그래프를 다시 구성해봅시다

 

아까 했던거 잠시 옆으로 미뤄두고 스테이트 머신을 하나 만들어연결하고 더블클릭!

 

 

이안에서도 스테이트들을 추가하여

 

이렇게 만들어 주고  Ground에는 아까 만든 idle 과 run을 넣어 줍시다.

 

그다음 화살표 더블클릭!

 

 

점프 할때와                                                                           점프 안할때를 나누어 줍시다.

 

 

 

그리고 이번엔 점프 애니메이션을 만들어보러 갑시다....

만드는것 까진 아니고 기존 언리얼에서 기본제공해주는 점프모션을 현재 스켈레톤 에셋에 리타깃 시켜줄겁니다!

 

 

먼저 언리얼 자체에서 제공하는 스켈레톤클릭 >> 리타깃 메니저 >>좌측 중간의 릭선택

 

인간형 릭 선택을 언리얼 스켈레톤과 사용하고있는 스켈에 둘다 해줍시다

 

 

그리고 점프하는 애니메이션 찾아서 리타깃 해줍시다.

 

아래처럼 설정후 리타깃!

 

굿!

 

이제 아래처럼 바꿔주고

 

 

 

 

 

 

 

끝!

 

 

 

틀린점이 있다면 댓 달아주세요!

댓글