ftftgop3 2024. 3. 10. 15:38

애니메이션 몽타주

캐릭터의 콤보 공격 애니메이션 및 기능을 추가 시

스테이트 머신에 각 콤보 별 스테이트를 단계별로 추가 해야 하는 단점 발생, 복잡해지는 머신

확장 없이 특정 상황에 원하는 애니메이션을 발동 시키는 걸 애니메이션 몽타주 기능

 

애니메이션 창에서 애닝 몽타주 생성

몽타주는 섹션을 단위로 애니메이션 관리

몽타주는 애니메이션 클립들의 일부를 자르고 붙이면서 새로운 애니메이션 생성 기법

 

몽타주 생성 예제

Attact1 이라는 섹션 생성 및 이름 변경 

해당 섹션에 Attack 1 ~4 애니메이션 배치 

Attack1 ~3 의 끝 시간 항목을 0.56, 0.67, 0.67 지정 후 빠르게 다음 애니메이션으로 전환

 

 

Attack 키 바인딩

프로젝트 셋팅 입력에서 Attack 액션 키로 마우스 왼쪽 지정 

ABCharacter 에서 액션 키 바인딩

 

몽타주 애니메이션 재생

애님 인스터스의 맴버 변수로 몽타주 애니메이션 관리

1. 생성자에서 초기화 및 로드

UCLASS()
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
	GENERATED_BODY()
	
public:
//...
	void PlayAttackMontage();


private:
//...
	//블루 프린트 편집 화면에서만 수정 가능
	UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Attack,
    Meta = (AllowPrivateAccess = true))
		UAnimMontage* AttackMontage;
};

2. Montage_IsPlaying 함수로 현재 실행 중인지 확인

3. 위의 판단에 따라 Montage_Play 으로 애니메이션 실행 

#include "ABAnimInstance.h"

UABAnimInstance::UABAnimInstance()
{
	CurrentPawnSpeed = 0.0f;
	IsInAir = false;
    //애닝 몽타주 로드
	static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MONTAGE
	(TEXT("/Game/Book/Animations/SK_Mannequin_Skeleton_Montage.SK_Mannequin_Skeleton_Montage'"));
	//로드 성공 시 지정
	if (ATTACK_MONTAGE.Succeeded())
	{
		AttackMontage = ATTACK_MONTAGE.Object;
	}

}
void UABAnimInstance::PlayAttackMontage()
{
	
	if (!Montage_IsPlaying(AttackMontage))
	{
		Montage_Play(AttackMontage, 1.0f);
	}
}

 

4. 애닝 블루 프린트에 몽타주 애니메이션 추가 

DefaultSlot 슬롯 추가, 언제든지 Attack 애니메이션 실행 가능

 

5. 캐릭터 클래스에서 애닝 인스턴스 접근 후 몽타주 실행

void AABCharacter::Attack()
{
	auto AnimInstance = Cast<UABAnimInstance>(GetMesh()->GetAnimInstance());
	if (AnimInstance == nullptr)
		return;

	AnimInstance->PlayAttackMontage();
	//ABLOG_S(Warning);
}