본문 바로가기
Unreal/Manual

Unreal C++ AnimNotify 사용 하기

by Dev_카페인 2023. 11. 30.
반응형

[Unreal/C++] AnimNotify 사용 하기

애니메이션 프로그래머는 Animation Notification (애니메이션 노티파이), 또는 AnimNotify (애님 노티파이), 줄여서 그냥 Notify (노티파이)를 통해 애니메이션 시퀀스 도중의 특정 지점에 이벤트가 발생하도록 구성할 수 있습니다. 노티파이는 걷기나 달리기 도중의 발소리같은 이펙트 추가 및 애니메이션 도중 파티클 시스템을 스폰시키는 데 주로 사용됩니다.

 

애니메이션 노티파이를 사용해 보겠습니다.

AnimNotify를 상속받은 C++ 클래스를 생성합니다.

 

C++ 클래스 생성시 아래와 같은 코드가 작성됩니다.

애니메이션 몽타주에서 Notify를 추가하기 위해서 UAnimNotify에 정의되어 있는 함수를 오버라이드 해야합니다.

#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimNotifies/AnimNotify.h"
#include "AN_DoubleShot.generated.h"

UCLASS()
class MAINPROJECT_API UAN_DoubleShot : public UAnimNotify
{
	GENERATED_BODY()
};

UAnimNotify클래스로 이동하여 헤더 코드를 잠깐 살펴보면 아래와 같은 함수를 볼 수 있습니다.

언리얼 엔진 5.0부터?는 상단에 있는 Notify함수를 사용하지 않고 아래쪽 함수를 이용하라고 합니다.

변경 전 API를 사용하려 하면 친절하게도 업데이트 안내를 받을 수 있습니다.

Please update your code to the new API before upgrading to the next release, otherwise your project will no longer compile.
다음 릴리스로 업그레이드하기 전에 코드를 새 API로 업데이트하세요. 그렇지 않으면 프로젝트가 더 이상 컴파일되지 않습니다.

UAnimNotify C++ 파일을 확인해보니 기존의 Notify함수는 비어있고 아래쪽에서 경고를 일으킨다는 함수가 보입니다.

Received_Notify정의가 없는 것을 보니 Blueprint에서는 Received함수를 사용하는 것 같습니다.

 

우리가 사용하게 될 아래 함수를 복사하여 헤더파일에 선언해주고 override합니다.

virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference);
#pragma once

#include "CoreMinimal.h"
#include "Animation/AnimNotifies/AnimNotify.h"
#include "AN_DoubleShot.generated.h"

UCLASS()
class MAINPROJECT_API UAN_DoubleShot : public UAnimNotify
{
	GENERATED_BODY()
	
	virtual void Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference) override;
};

 

이 Notify함수를 구현합니다.

부모의 Notify 함수를 호출해주고

사용할 오브젝트나 클래스를 받아 원하는 기능을 구현합니다.

이 때 조심할점은 에디터에서 게임이 시작되기 전에는 오브젝트나 클래스가 할당되지 않은 상태가 많기 때문에 예외처리를 꼼꼼히 해주셔야 합니다.

#include "Character/Notifies/AN_DoubleShot.h"
#include "Character/Character_TwinBlast.h"

void UAN_DoubleShot::Notify(USkeletalMeshComponent* MeshComp, UAnimSequenceBase* Animation, const FAnimNotifyEventReference& EventReference)
{
	Super::Notify(MeshComp, Animation, EventReference);

	ACharacter_TwinBlast* character = Cast<ACharacter_TwinBlast>(MeshComp->GetOwner());

	if (character == nullptr) return;

	character->Function();
}

 

위 처럼 구현을 마친 코드는 컴파일 후 애니메이션 몽타주에 애니메이션 노티파이를 추가할 수 있습니다.

추가하기 전에 애니메이션 몽타주를 일시정지 하지 않으면 설정과 동시에 Fatal Error를 마주할 확률이 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형