언리얼에서의 애니메이션은 별도의 클래스에 몰빵해서 관리한다.

 

C++ 클래스로 만들 때, 부모 클래스를 AnimInstance로 고른다.

 

UPROPERTY(EditAnywhere, BlueprintReadOnly, Category=Pawn, Meta=(AllowPrivateAccess=true))
float Speed;

 

UPROPERTY의 각 인자는 필요할 때마다 구글링하면 되므로 우선은 넘어간다.

 

 

AnimInstance C++ 클래스를 만들고,

 

 

 

해당 C++ 클래스를 상속받는 블루프린트 애니메이션을 만들고, (블루프린트 클래스가 아닌것에 유의)

 

 

 

해당 애니메이션을 적용시킬 BP_MyCharacter의 Animation Bluprint를 위의 ABP_MyAnim으로 설정한다.

 

실행 도중에 애니메이션 블루프린트에 들어가보면 현재 실행중인 애니메이션이 어떤 것인지 확인할 수 있다.

 

 

 

위에서 선언한 Speed는 애님 프리뷰 에디터에서 확인할 수 있다.

 

 

 

AnimGraph를 통해서 관리할 수 있다.

 

 

애니메이션에 관련된것은 AnimInstance에서 몰빵해서 관리하게 되는데, 실제로 어떤 입력값에 의해 이동이 발생해서 그 값으로 애니메이션의 상태가 결정되어야 하는 경우 AnimInstance의 값에 접근할 수 밖에 없다.

MyCharacter에서 움직임이 발생할때 마다 필요한 정보를 GetAnimInstance 등등 접근해서 수단과 방법을 가리지 않고 세팅하는 방법, 반대로 AnimInstance에서 매 틱마다 외부의 정보를 수집해서 자신에게 세팅하는 방법이 있을 것이다.

 

전자의 경우 코드가 뒤섞일 우려가 있다.

그래서 후자의 경우를 사용하는 게 일반적이다.

 

// 헤더
class TESTUNREALENGINE_API UMyAnimInstance : public UAnimInstance
{
	GENERATED_BODY()

	virtual void NativeUpdateAnimation(float DeltaSeconds) override;

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

// ------

// cpp
void UMyAnimInstance::NativeUpdateAnimation(float DeltaSeconds)
{
	Super::NativeUpdateAnimation(DeltaSeconds);
    
    // 현재 AnimInstance를 소유중인 Pawn을 가져오는 것을 시도함
	auto pawn = TryGetPawnOwner();
    
    // '시도' 이기 때문에 못 가져올 수도 있으므로 유효한 값인지 검사
	if (IsValid(pawn))
	{
		Speed = pawn->GetVelocity().Size();
	}
}

 

애니메이션 블루프린트를 만들면 테스트 하기가 편하다.

+ Recent posts