본문 바로가기
Unreal Engine/UE4 C++ 게임 개발 공부

[UE4 C++] 애니메이션 시스템 활용(Animation Montage, 델리게이트, Animation Notify)

by JJPearl 2022. 1. 13.
반응형

캐릭터에 공격 기능을 만들려 할 때 스테이트 머신을 사용한다면

모든 공격에 대한 스테이트, 트랜지션을 만든다면 스테이트를 계속 추가해야 하고 스테이트 머신이 복잡해질 것이다.

 

애니메이션 몽타주(Animation Montage)

스테이트 머신 확장 없이 특정 상황에서 원하는 애니메이션을 발동시키는 기능.

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

여러 애니메이션 클립들의 일부를 떼어내고 붙여서 새로운 애니메이션을 생성하는 기법. 이 때 섹션 단위로 애니메이션을 자르고 붙이는 작업을 진행.

 

 

- 애님 인스턴스에서 몽타주 애니메이션 실행

애님 인스턴스에 멤버 함수와 멤버 변수를 생성한다.

몽타주 플레이 멤버 함수
몽타주 애셋 저장하는 멤버 변수

 * UPROPERTY 키워드 Anywhere에서 세분화된 키워드

  • InstanceOnly : 인스턴스의 속성을 보여주는 에디터 뷰포트에서만 보여짐
  • DefaultsOnly : 클래스 기본값 담당하는 블루프린트 편집 화면에서만 보여짐

 

몽타주 애셋 관련 명령은 항상 몽타주 애셋을 참조한다.

따라서 애님 인스턴스의 생성자에서 애님 몽타주 멤버 변수에 미리 설정해두면 편리하다. 

static ConstructorHelpers::FObjectFinder<UAnimMontage> ATTACK_MTG(TEXT("레퍼런스 복사"));
	if (ATTACK_MTG.Succeeded())
	{
		AttackMontage = ATTACK_MTG.Object;
	}

 

컴파일 후 애니메이션 블루프린트에 몽타주 에셋이 자동 할당된 것을 볼수 있다.

몽타주에게 재생 명령을 내려도 몽타주 재생노드를 애님그래프에 추가해야 애니메이션 블루프린트에서 이를 재생한다.

애님 그래프에 DefaultSlot을 추가해 최종 애니메이션 포즈와 스테이트 머신 사이에 추가한다.(모든 상황에서 몽타주 재생)

이 Slot이라는 것이 몽타주를 플레이 하거나 몽타주랑 메세지를 오고가게 하는 역할을 한다.

몽타주 재생 담당하는 슬롯 노드 추가

 

 

 

델리게이트

프로그래밍적 개념 : 특정 객체가 해야 할 로직을 다른 객체가 대신 처리할 수 있도록 만드는 보편적인 설계 개념

 

언리얼 엔진의 델리게이트는 A객체가 B객체에 작업 명령을 내릴 때 B객체에 자신을 등록하고 B의 작업이 끝나면 그 때 A에게 알려주는 설계 방식

A가 B가 요구하는 방식으로 멤버 함수를 만들어 이를 B에 등록하고,

B가 특정 상황이 될때 B가 미리 등록해둔 A의 멤버함수를 호출하는 방식으로 동작.

 

C#과 같은 언어는 기본으로 제공, C++은 오래되서 지원 X

--> 언리얼 엔진에서 별도로 구축한 델리게이트 프레임워크 사용

 

- 애님 인스턴스의 델리게이트

애님 인스턴스에는 애니메이션 몽타주 재생이 끝나면 발동하는 OnMontageEnded라는 델리게이트를 제공.

어떤 언리얼 오브젝트라도 UAnimMontage* 인자와 bool 인자를 가진 멤버함수를 갖고 있따면,

이 함수를 OnMontageEnded 델리게이트에 등록해 몽타주 재생이 끝나는 타이밍을 파악할 수 있다.

단, OnMontageEnded 델리게이트는 블루프린트의 함수와도 연동할 수 있도록 설계되어 있으므로

C++에서 연동하려는 함수는 UFUNCTION() 매크로를 추가로 선언해 블루프린트와 호환되는 함수형으로 선언해야 한다.

언리얼 델리게이트는 C++ 객체에만 사용할 수 있는 델리게이트 / C++,블루프린트 객체가 모두 사용할 수 있는 델리게이트로 나뉜다.
이렇게 블루프린트 객체와도 연동하는 델리게이트를 다이내믹 델리게이트(Dynamic Delegate)라고 한다.

 

 

 

 

애니메이션 노티파이

- 애니메이션 노티파이 : 애니메이션을 재생하는 동안 특정 타이밍에 애님 인스턴스에게 신호를 보내는 기능

일반 애니메이션 / 몽타주 모두 사용 가능.

애니메이션 노티파이 추가 방법
노티파이 추가한 결과 화면

 

애니메이션 노티파이를 추가하면 선택 후 우측 Category 에서 Montage Tick Type을 지정할 수 있다.

  • Branching Point : 해당 프레임에 즉각적으로 반응하는 방식. 섹션을 바꾸거나 몽타주 위치 변경에 적합.
  • Queued : 비동기 방식으로 신호를 받아 적절한 타이밍에 신호를 받는 것을 놓칠 수 있다. 주로 타이밍에 민감하지 않은 사운드나 이펙트를 발생시킬 때 사용.

 

- 노티파이 호출

  1. 노티파이가 추가된 해당 몽타주 애니메이션을 재생하면 재생 구간에 위치한 노티파이를 호출.
  2. 노티파이가 호출되면 애님 인스턴스 클래스의 'AnimNotify_노티파이명' 이름의 멤버 함수를 찾아서 호출.
    • 해당 멤버 함수 역시 언리얼 런타임이 찾을 수 있도록 UFUNCTION 매크로를 지정.
    • 이유는 다이내믹 델리게이트 연동 함수에 UFUNCTION 붙여야 하는 이유와 동일.

 

애님 인스턴스.cpp에 'AnimNotify_노티파이명' 함수를 구현

반응형