UAnimInstance

UAnimInstance는 언리얼 엔진에서 캐릭터의 애니메이션 상태를 관리하는 핵심 클래스이다.

 

  • 현재 캐릭터 상태(속도, 방향, 점프 여부 등)에 따라 애니메이션을 갱신
  • AnimGraph, State Machine 등을 통해 애니메이션 전환 관리
  • C++에서 애니메이션 파라미터를 제어하거나 가져올 수 있음

캐릭터 애니메이션 시스템의 생성

스켈레탈 메시 컴포넌트의 애니메이션 블루프린트 클래스를 지정한다.
• 캐릭터가 초기화될 때 AnimInstance 클래스의 인스턴스를 생성한다.
• 캐릭터는 GetAnimInstance 함수를 사용해 애니메이션 인스턴스를 얻을 수 있음
• 애니메이션 인스턴스는 GetOwningActor 함수를 사용해 자신을 소유한 액터 정보를 얻을 수 있음

 

캐릭터 애니메이션 시스템의 설계

애니메이션 블루프린트는 이벤트 그래프와 애님 그래프의 두 영역으로 구성되어 있음.
• 이벤트 그래프에서는 이벤트로부터 상태를 파악할 수 있는 주요 변수를 저장하는데 사용
• 애님 그래프에서는 저장된 변수로부터 지정된 상태의 애니메이션을 재생
• 애님 그래프의 복잡한 상태는 State Alias로 분리해 효과적으로 설계할 수 있음

<예시>

UAnimInstance를 상속받는 UABAnimInstance 클래스 만들기

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

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

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

public:
	UABAnimInstance();

	//애니메이션 초기화될 때 호출.
	virtual void NativeInitializeAnimation() override;
	//애니메이션 업데이트 함수.
	virtual void NativeUpdateAnimation(float DeltaSeconds) override;

	//프로퍼티.
public:
	//애님 인스턴스를 소유하는 캐릭터 참조 변수.
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Character)
	TObjectPtr<class ACharacter> Owner;

	//캐릭터 무브컨트 컴포넌트 참조 변수.
	UPROPERTY(VisibleAnywhere, BlueprintReadOnly, Category = Character)
	TObjectPtr<class UCharacterMovementComponent> Movement;

	//캐릭터의 현재 이동속도를 저장할 변수.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	FVector Velocity;

	//캐릭터의 땅에서의 이동속도를 저장할 변수.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	float GroundSpeed;

	//캐릭터가 Idle인지 여부를 확인할 변수.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	uint8 bIsIdle : 1;

	//캐릭터가 이동하는지(멈춰있는지) 여부를 판단하는데 사용할 문턱 값.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	float MovingThreshold;

	//캐릭터가 공중에서 떨어지는지 여부를 확인하는데 사용할 문턱값.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	uint8 bIsFalling :1;

	//캐릭터가 점프하는지 여부를 확인하는데 사용할 문턱값.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	uint8 bIsJumping :1;

	//캐릭터가 점프하고있는지 여부를 판단하는데 사용할 문턱 값.
	UPROPERTY(EditAnywhere, BlueprintReadOnly, Category = Character)
	float JumpingThreshold;
};

<CPP>

// Fill out your copyright notice in the Description page of Project Settings.


#include "Animation/ABAnimInstance.h"
#include "GameFramework/Character.h"
#include "GameFramework/CharacterMovementComponent.h"

UABAnimInstance::UABAnimInstance()
{
	//문턱값 설정.
	MovingThreshold = 3.0f;
	JumpingThreshold = 100.0f;
}

void UABAnimInstance::NativeInitializeAnimation()
{
	Super::NativeInitializeAnimation();
	//애님 인스턴스를 소유한 폰 또는 액터를 캐릭터로 변환.
	Owner = Cast<ACharacter>(GetOwningActor());

	//캐릭터로 형변환 성공.
	if (Owner)
	{
		//무브먼트 컴포넌트 검색.
		Movement = Owner->GetCharacterMovement();
	}
}

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

	//필요한 값 업데이트.
	if (Movement)
	{
		Velocity = Movement->Velocity;
		GroundSpeed = Velocity.Size2D();
		bIsIdle = GroundSpeed < MovingThreshold;
		bIsFalling = Movement->IsFalling();
		bIsJumping = bIsFalling & (Velocity.Z > JumpingThreshold);
	}
}

캐릭터 블루프린트의 Mesh컴포넌트->Animation->AnimClass에 생성한 UABAnimInstance를 설정

 

블루프린트 새로 공부한 기능 Add State Alias 노드

Add State Alias애니메이션 상태 머신(State Machine) 내에서 기존 상태에 '별칭(Alias)'을 붙이는 기능이다.
애님 블루프린트 로직이 많아질수록 보기가 힘들어지는데 별칭을 만들어서 구분지어 사용하는 기능이다.
별칭은 상태 변경을 하지 않고 구조는 유지하면서 의미를 확장할 때 유용합니다.
!!참고!! 너무 많은 별칭은 오히려 헷갈릴 수 있으니, 상황에 맞게 최소화해서 사용해야 한다.

*ToLand를 Add State Alias노드로 만들어 Jump, Falling 노드들일때만 탈수 있게 했다.

애니메이션 새로 공부한 기능 Additive Anim Type

Additive Animation은 기존의 기준 포즈(Base Pose)에 대해 상대적으로 덧붙이는 방식의 애니메이션이다.

모드설명

No Additive 일반 애니메이션 (덧셈 없음)
Local Space Additive 본 로컬 좌표계 기준으로 차이 계산
Mesh Space Additive 전체 메시 기준의 글로벌 좌표계에서 차이 계산

Local Space는 각 본이 자기 기준으로 움직이고,
Mesh Space는 메시 전체 좌표계를 기준으로 계산합니다.

<예시>

 

'언리얼 엔진 공부 > 언리얼C++' 카테고리의 다른 글

아이템 시스템(트리거)  (0) 2025.04.21
캐릭터 공격 판정  (0) 2025.04.18
데이터 애셋  (0) 2025.04.14
언리얼 엔진 게임 제작 기초  (0) 2025.04.10
어설션(Assertion)  (0) 2025.04.08

+ Recent posts