* 캐릭터에 공격 기능을 넣기 위해 공격 입력을 설정하고 공격 입력을 누를 때마다 캐릭터가 연속된 모션으로 공격하도록 애니메이션 기능을 구현한다

* 언리얼 엔진은 스테이트 머신의 확장 없이 특정 상황에서 원하는 애니메이션을 방동시키는 애니메ㅣ션 몽타주라는 기능 제공한다. 이를 활용한 콤보 공격기능을 구현해본다.

* 애니메이션창을 열고 애님 몽타주 생성 메뉴를 눌러 몽타주 애셋을 생성한다.

 


 

* 몽타주는 섹션을 단위로 애니메이션을 관리한다.
* 본래 몽타주는 촬영된 화면이나 인쇄된 종이를 뗴어 붙여서 새로운 장면이나 이미지를 만드는 미술 기법을 의미한다. 애니메이션 몽타주도 이와 유사하게 여러 애니메이션 클립들의 일부를 뗴어내고 붙여서 새로운 애니메이션을 생성하는 기법이다.
* 이때 섹션 단위로 애니메이션들을 자르고 붙이는 작업을 진행한다.

몽타주 애셋을 생성하면 기본으로 Default라는 이름의 섹션이 주어진다. 

기본 생성시 화면


 

* 이제 섹션을 클릭하고, 디테일 창에서 Default에서 Attack1으로 변경한다. 

* 준비된 공격 애니메이션을 1부터 4까지 드래그 하면, 클립이 지그재그로 배치된다.

드래그를 하면 지그재그로 배치가 된다.

 


* 이제 입력에서 Attack 맵핑을 추가하고, 이를 바인딩 한다

//ABCharacter.h
{
public:
	void Attack();
}

//ABCharacter.cpp
void AABCharacter::SetupPlayerInputComponent(UInputComponent* PlayerInputComponent)
{
...
   PlayerInputComponent->BindAction(TEXT("Attack"), EInputEvent::IE_Pressed, this, &AABCharacter::Attack);
}

 

* 이번에는 애님 인스턴스에 멤버 함수화 변수를 생성하고 함수를 실행하면 몽타주 애니메이션을 재생하도록 기능을 구현한다.
* Montage_IsPlaying 함수를 사용해 현재 몽타주가 재생하는지 파악하고, 재생 중이 아니면 Montage_Play 함수를 사용해 재생하도록 로직을 구현한다.

 

//ABAnimInstance.h
class ARENABATTLE_API UABAnimInstance : public UAnimInstance
{
public:	
    void PlayAttackMontage();
private:
	UPROPERTY(VisibleDefaultsOnly, BlueprintReadOnly, Category = Attack, Meta = (AllowPrivateAccess = true))
	UAnimMontage* AttackMontage;
}

//ABAnimInstance.cpp
#include "ABAnimInstance.h"

UABAnimInstance::UABAnimInstance()
{
...
	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);
    }
}

 

* 컴파일 하고 애니메이션 블루프린트를 열어보면, 해당 속성에 몽타주 애셋이 자동 할당된 것을 볼 수 있다.


 

* 몽타주에게 재생 ㅁ병령을 내려도 애니메이션 블루프린트에서 이를 재생하려면 몽타주 재생 노드를 애님 그래프에 추가해야 하낟. 이 몽타주 재생 노드를 적당한 애니메이션 재생 흐름 사이에 끼워 넣으면 해당 타이밍에 발동할 수 있다. 

* 우리는 모든 상황에서 몽타주를 재생할 예정이므로 애님 그래프의 최종 애니메이션 포즈와 스테이트 머신 사이에 몽타주 재생 노드를 추가해 본다.

 

* 노드 완성 후 캐릭터에게 몽타주를 사용해 공격 애니메이션을 재생하라는 명령을 내린다.

//AABCharacter.cpp

#include "ABGameInstance.h"
void AABCharacter::Attack()
{
  auto AnimInstance = Cast<UABAnimInstance>(GetMesh()->GetAnimInstance());
  if(nullptr == AnimInstance) return;
  
  AnimInstance->PlayAttackMontage()
}

 

* 이제 실행을 하고 마우스 공격 클릭을 하면 공격 애니메이션이 재생된다.

+ Recent posts