4.21.2014

애니메이션 노티파이 특강

By * Benn Gallagher

블루프린트 노티파이

블루프린트 노티파이는 애니메이션 시퀸스나 몽타주의 지정된 시간에 블루프린트로 정의된 커스텀 로직을 발동시키는 수단입니다. 이 개념은 UE3/UDK 의 애니메이션 노티파이와 유사하지만, 작업방식이 훨씬 부드럽고 코드는 사용되지 않습니다. 애니메이션 노티파이를 새로 만들려면, 블루프린트를 새로 만든 다음 새 블루프린트 대화창의 "Custom Classes" 섹션의 클래스로 AnimNotify 를 선택합니다:

Creating a new animation notify

블루프린트 에디터에서 새 블루프린트를 열어보면 그래프 없이 '내 블루프린트' 탭에 'Received_Notify' 라는 덮어쓰기 가능한 함수가 들어있는 빈 블루프린만 보입니다. 이 함수를 구현하면 애니메이션이나 몽타주에서 새로 만든 노티파이가 발동될 때 실행되는 이벤트 그래프가 생성됩니다.

새로 만든 노티파이를 사용하려면, 시퀸스 또는 몽타주를 연 다음 노티파이 트랙을 찾아 우클릭합니다. 새로 만든 노티파이가 맥락 메뉴 상단 부분에 나타날 것입니다.

블루프린트로 애니메이션 안에 약간의 로직을 돌리는 것도 괜찮지만, 위치, 색, 클래스 등 같이 작업을 할 수 있는 데이터를 블루프린트에 줄 수 없다면 할 수 있는 일이 제한될 것입니다. 다행히도 줄 수 있으며, 꽤나 간단한 프로세스입니다. 이 그래프 안에 생성된 변수는 시퀸스나 몽타주 편집시 페르소나에 노출되며, 페르소나에서 선택시 디테일 패널에 나타납니다:

Bluepritn variables in the blueprint editorThe animation details panel

불리언이나 인티저처럼 단순한 유형에서부터 좀 더 복잡한 액터 클래스에 이르기까지 블루프린트에 정상적으로 사용가능하면 어떠한 유형이든 노출시키는 데 사용할 수 있습니다. 다른 블루프린트와의 통신 방법 역시 애니메이션이 복잡한 이벤트 시퀸스를 발동시킬 수 있도록 작동합니다.

이벤트 노티파이

환경설정 가능한 데이터가 필요치 않고 한 스켈레톤 전용이라 (즉 여러 스켈레톤에 재사용되지 않아) 더 단순한 로직이 필요하다면 이벤트 노티파이가 더 나은 옵션이 될 수 있습니다. 블루프린트 노티파이 추가에 사용된 동일한 맥락 메뉴에 'New Notify' (새 노티파이)라는 옵션이 있습니다. 이 옵션은 데이터가 붙지 않고, 이름만 있는 트랙에 노티파이를 추가해 줍니다. 추가하고나면 루트 애니메이션 그래프 어느 곳에서든 해당 애니메이션을 재생 또는 평가중인 애니메이션 블루프린트는, 이벤트 그래프 내 이벤트처럼 그 노티파이에 접근하게 됩니다. 이러한 이벤트는 함수와 비슷한 방식으로 작동하며, 애니메이션에서 발동될 때마다 실행이 전달됩니다.

Event notify in a blueprint

디폴트 노티파이

이 글 작성 시점에서 언리얼 엔진 4 의 에디터 내 Engine 콘텐츠 폴더에 사용할 수 있는 디폴트 블루프린트 노티파이가 둘, AnimNotify_PlayParticleEffect 와 AnimNotify_PlaySound 가 있습니다. 이 노티파이는 위에서 언급한 블루프린트 노티파이와 똑같은 방식으로 생성되었으며, 직접 커스텀 블루프린트 노티파이 셋업 작업을 하는 데 있어 뛰어난 시작점 또는 참고가 될 수 있습니다.

노티파이 스테이트

노티파이 스테이트는 약간 다르며, 특정 함수성에 대해 시작과 중지가 있으면 좋은 상황, 아니면 캐릭터가 어떤 작업을 하고있을 때 연속적인 업데이트 틱이 필요한 경우에 최적화되어 있습니다. 노티파이 스테이트 생성은 블루프린트를 파생시킬 클래스를 선택할 때 'AnimNotifyState' 를 선택한다는 점만 빼면 블루프린트 노티파이 생성시와 비슷합니다.

블루프린트 노티파이와 마찬가지로 노티파이의 함수성 역시도 이번엔 세 개의 함수, 'Received_NotifyBegin', 'Received_NotifyTick', 'Received_NotifyEnd' (시작, 틱, 끝)을 구현하는 것으로 생성합니다. '시작'과 '끝'은 노티파이 스테이트의 시작과 끝에서 호출되며, '틱'은 애니메이션이 노티파이 스테이트 안에 있을 때 매 프레임마다 호출됩니다.

An Implemented notify state tick function

노티파이는 그 안에 인스턴싱된 데이터를 저장할 수 없다는 점에서 일반 블루프린트와 비교할 때 명백한 한계점이 있습니다. 실질적으로 변수는 노티파이 안에서는 설정할 수는 없고, 노티파이 속으로 데이터를 전달하는 데만 사용 가능하다는 뜻입니다. 왜냐하면 노티파이는 애니메이션 시퀸스에 속하며, 해당 시퀸스를 재생하는 각 스켈레탈 메시는 같은 오브젝트를 레퍼런싱하기 때문입니다.

네이티브 애니메이션 노티파이

노티파이 이벤트를 처리는 블루프린트만 가능한 것이 아닙니다. 코드에서도 네이티브로 구현 가능합니다. UAnimNotify 또는 UAnimNotifyState 를 파생하거나 클래스 뷰어를 사용해서 수동으로 새 클래스를 생성해 주기만 하면 됩니다. 애니메이션 노티파이의 경우 단순히 Received_Notify 만 구현해 주면 되고, 애니메이션 노티파이 스테이트의 경우 Received_NotifyBegin, Received_NotifyTick, Received_NotifyEnd 를 구현합니다. 페르소나에서 네이티브 노티파이는 메뉴의 자체 섹션에 나타납니다:

adding a native anim notify

블루프린트 노티파이와 마찬가지로, 네이티브 노티파이는 약간의 특수 문법이 필요하기는 하지만, 노티파이의 디테일 패널에서 변수를 설정하도록 노출시키는 것이 가능합니다. 노티파이 클래스 예제는 이렇습니다:

UCLASS()

class UAnimNotifyNativeTest : public UAnimNotify

{

GENERATED_UCLASS_BODY()

virtual bool Received_Notify(class USkeletalMeshComponent* MeshComp, class UAnimSequence* AnimSeq) const;

UPROPERTY(EditAnywhere, Category = Parameters)

float TestFloatParameter;

UPROPERTY(EditAnywhere, Category = Parameters)

UClass* TestClassParameter;

UPROPERTY(EditAnywhere, Category = Parameters)

TArray<int32> TestArrayParameter;

};

코드에서 변수를 노출할 때는, 프로퍼티 매크로 줄에 'EditAnywhere' 메타데이터와 함께 디테일 패널에서 변수가 위치할 카테고리를 넣어줘야 합니다.

블루프린트 및 애니메이션 블루프린트 관련 상세 문서는 다음 문서를 참고해 주시기 바랍니다: 블루프린트, 애니메이션 블루프린트.

여러분께 유용한 정보였으면 좋겠습니다! 언제나처럼 질문이나 코멘트가 있으신 경우, 한글 네이버 카페, 영문 포럼 에 들러 말씀 남겨주시기 바랍니다.

Recent Posts

REWIND, 언리얼 엔진으로 가상의 Hacker Hostel에 생명을 불어넣다

가상현실 속에서 Silicon Valley의 Hacker Hostel을 방문해 장난감을 가지고 놀고, 음식을 맛보고, 마음껏 놀아 보세...

Grishin Robotics, 에픽게임즈의 언리얼 엔진과 함께 미래를 향한 박차를 가하다

소비자 로봇 공학 스타트업에 초점을 맞춘 벤처 자본 회사 Grishin Robotics는 에픽게임즈의 언리얼 엔진을 사용하여 로봇 공학...

2018년 6월 NVIDIA Edge 프로그램 수상자

NVIDIA Edge 프로그램의 주요 제출작으로는 아름다운 배경, 건축 시각화와 멋진 게임들이 있습니다. 6월의 수상자들을 한번 살펴보...