AnimInstance와 AnimNofity를 처음써보면서 생긴일 기록
필자는 캐릭터의 콤보공격을 구현하기 위해 AnimInstance와 AnimNotify를 사용해 보았음.
생성방법
Tools - New C++ Class... -> AnimInstance를 부모로 두고 생성.
코드를 진행하기 전에 AnimNotify란?
AnimNotify는 애니메이션 시퀀스 내에 특정 부분에서, 외부 이벤트를 발생시키는 트리
설정된 특정 부분에서 나이아가라 이펙트, 사운드부터 여기서 사용할 커스텀 이벤트까지 발생시켜볼 수 있다.
아래 사용예시는 공격 애니메이션 몽타주에서 노티파이를 이용해
다음콤보 입력구간, 다음공격을 발생시키는 이벤트,
공격 모션에 맞춰 무기 히트박스를 활성화시키고 종료시키는 노티파이를 커스텀해 생성한것이다.

다만 이처럼 원하는 커스텀 노티파이를 만드는것은 Anim Montage에서 가능하다.
사용할 애니메이션 시퀀스를 우클릭하고 Create->Create Anim Montage를 선택하여 진행 가능하다.

AnimInstance와 AnimMontage를 만들었다면 이들을 연결해볼 차례다.
원래 Animation Blueprint를 만들었을 때와 다르게, 아까 생성한 c++ Anim Instance클래스를 상속받은 ABP를 만든다.


필자는 BaseCombatAnimInstance를 상속받은 ABP_Combat_Custom를 생성하였다.
앞으로 상속받은 ABP를 기존처럼 사용하면 된다.
AnimInstance의 헤더 C++파일로 이동해서,
원하는 Notify를 정의해주어야 한다.
단 규칙이 정해져있으니 이를 지켜야 한다.

이름은 "AnimNotify_" 로 시작해서 뒤에는 사용한 AnimNotify의 이름이 되어야한다.
언리얼엔진은 자동으로 이를 인식하여 Notify가 발생하는 타이밍에서 해당 함수가 호출된다.
이외 부분은 원하는대로 작성하도록 한다.
다만 이 코드는 이벤트를 발생시켜주는 델리게이트 정도의 역활로 사용해야지
실제 로직을 실행하는 용도로 사용하는것은 일반적인 방법이 아니니 주의해야한다.
작성하였다면 다시 AnimMontage로 돌아간다.

애니메이션 탭에서 드래그를 하는 등으로 특정 구간의 에니메이션을 멈춰보거나 실행할 수 있다.
탭 왼편에 Notifies의 아래에 라인이 존재하는데 (기본값은 1 하나)
해당 라인에 프레임 위치에 우클릭을 하여 Notify를 추가할 수 있다.

우리가 슬 커스텀 노티파이는 Montage Notify.
다른건 각각의 기능이 이미존재하니 각자 확인.


초기 Notify는 이름이 None인 상태인데, 클릭하여 디테일 패널로 가면 수정할 수 있다.
다만 이렇게 수동으로 하는 방법은 매우 불편하여 Animation Notifies 창을 열고 하는걸 추천한다.
필자는 하나하나 입력하였더니 아무 이벤트도 발생하지 않는 경우도 겪었다.


Animation Notifies창에서 우클릭-New Notify를 선택하여 아까 코드에서 지정한 이름들을 추가해둔다.
이후 애니메이션 탭에서 Notify추가시도시 바로 확인할 수 있다.

이제 원하는 노티파이를 애니메이션의 원하는 구간에 설치하도록 한다.
설정이 끝났다면, 아까 AnimInstance를 상속받은 ABP로 이동하여, Slot 'DefaultSlot' 노드를 Output 이전에 추가해둔다.
AnimMontage는 ABP에 상태머신과 별개로 즉시 출력되도록 사용한다.
해당 슬롯관련한 내용은 기회가 있으면 다뤄보도록 하자.

슬롯 노드 앞에는 원래의 Locomotion이라던지 등등이 있을것이다.
이제 어떤 방식으로든 캐릭터가 AnimMontage를 실행하도록 해주면된다.
내 경우 캐릭터가 3연속 검을 휘두르는 모션에 각각의 노티가 설정되어있다.
C++에서 Montage를 실행하는 방법?
.h
어떤 방식으로든 코드에서 UAnimMontage를 가져오도록 함.
UPROPERTY(EditAnywhere, BlueprintReadOnly, Category="Weapon|Attack")
UAnimMontage* AttackComboMontage;
.cpp
if (!AttackComboMontage)
return;
UAnimInstance* AnimInstance = OwnerCharacter->GetMesh()->GetAnimInstance();
if (!AnimInstance)
return;
AnimInstance->Montage_Play(AttackMontage);
AnimInstance는 따로 아까 생성한 Instance로 캐스팅할 필요는 없다.
여기까지 정상적으로 왔다면 기본적인 세팅은 완료가 되었다.
다만 좀 수정할 부분이 아직 있다.
애니메이션 몽타주로 이동한다.

노티파이의 디테일 패널에서 Event-Montage Tick Type을 Branching point로 모두 변경한다,.
Queue방식은 비동기 방식으로, 성능이 좋지만 늦게 발생할 가능성이 있어 즉각 반응할 필요가 없을때 사용한다, 발소리같은 중요하지 않은 로직에 권장,
Branching Point는 동기 방식으로, 해당 부분에 도달하면 즉시 이벤트가 발생한다.
구현중인 공격기능을 위해서는 후자가 더 적절하다.
두번째로 변경할것으로, 기본 왼편의 Asset Detail 패널에서 Blend Out Trigger Time을 기본값 -1에서 0으로 수정한다.

해당 기능은 애니메이션이 종료할 때 다른 애니메이션과 자연스러운 전환을 돕는 값인데,
이 기능이 작동하면 전환 시작이 되는 구간에서 Notify가 작동하지 않게 된다.
내 경우, 애니메이션이 끝날때 EndAttack 노티파이를 발생시켜야 해서 0으로 변경하였다.
필요에 따라 다른 값을 설정해도 되지만, 상황을 잘 확인해야 한다.
여기까지 설정하였으면 애님 인스턴스에서 함수 호출이 정상적으로 아마 잘 될것이다.
공식문서 AnimNotify
https://dev.epicgames.com/documentation/unreal-engine/animation-notifies-in-unreal-engine?lang=ko
Animation Notifies in Unreal Engine | Unreal Engine 5.7 Documentation | Epic Developer Community
Send and receive events synchronized to Animation Sequences using Animation Notifies.
dev.epicgames.com
'개발 > 언리얼' 카테고리의 다른 글
| WorldSubsystem (0) | 2026.05.22 |
|---|---|
| UAnimNotifyState_TimedNiagaraEffect, 트레일(궤적) 이펙트 에셋 적용 (0) | 2026.05.12 |
| 언리얼 캐릭터 무기 위치 조정 및 부착(Skeleton, Socket) (0) | 2026.05.04 |
| 언리얼 C++ 애니메이션 몽타주 사용방법 (0) | 2026.05.04 |
| 서브클래스 샌드박스 패턴, 템플릿 메서드 패턴 (0) | 2026.05.01 |