언리얼 C++ 게임 개발의 정석/7. 애니메이션 시스템 활용
7.1 애니메이션 몽타주
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);
}