* 캐릭터에 공격 기능을 넣기 위해 공격 입력을 설정하고 공격 입력을 누를 때마다 캐릭터가 연속된 모션으로 공격하도록 애니메이션 기능을 구현한다
* 언리얼 엔진은 스테이트 머신의 확장 없이 특정 상황에서 원하는 애니메이션을 방동시키는 애니메ㅣ션 몽타주라는 기능 제공한다. 이를 활용한 콤보 공격기능을 구현해본다.
* 애니메이션창을 열고 애님 몽타주 생성 메뉴를 눌러 몽타주 애셋을 생성한다.
* 몽타주는 섹션을 단위로 애니메이션을 관리한다.
* 본래 몽타주는 촬영된 화면이나 인쇄된 종이를 뗴어 붙여서 새로운 장면이나 이미지를 만드는 미술 기법을 의미한다. 애니메이션 몽타주도 이와 유사하게 여러 애니메이션 클립들의 일부를 뗴어내고 붙여서 새로운 애니메이션을 생성하는 기법이다.
* 이때 섹션 단위로 애니메이션들을 자르고 붙이는 작업을 진행한다.
몽타주 애셋을 생성하면 기본으로 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()
}
* 이제 실행을 하고 마우스 공격 클릭을 하면 공격 애니메이션이 재생된다.
'Unreal > Game 1 (C++)' 카테고리의 다른 글
11.애니메이션 노티파이 + 콤보 공격 구현 (0) | 2019.05.02 |
---|---|
10.델리게이트, 다이나믹 , 멀티캐스트 , 다이나믹 멀티, 시그니처 (1) | 2019.05.02 |
8.점프구현 / 캐릭터 상태체크 (0) | 2019.05.02 |
7.애니메이션 폰과 데이터 연동 (0) | 2019.05.02 |
6.3인칭 컨트롤 구현 (디아블로방식) (0) | 2019.05.02 |