블루프린트 노티파이
블루프린트 노티파이는 애니메이션 시퀸스나 몽타주의 지정된 시간에 블루프린트로 정의된 커스텀 로직을 발동시키는 수단입니다. 이 개념은 UE3/UDK 의 애니메이션 노티파이와 유사하지만, 작업방식이 훨씬 부드럽고 코드는 사용되지 않습니다. 애니메이션 노티파이를 새로 만들려면, 블루프린트를 새로 만든 다음 새 블루프린트 대화창의 "Custom Classes" 섹션의 클래스로 AnimNotify 를 선택합니다:
블루프린트 에디터에서 새 블루프린트를 열어보면 그래프 없이 '내 블루프린트' 탭에 'Received_Notify' 라는 덮어쓰기 가능한 함수가 들어있는 빈 블루프린만 보입니다. 이 함수를 구현하면 애니메이션이나 몽타주에서 새로 만든 노티파이가 발동될 때 실행되는 이벤트 그래프가 생성됩니다.
새로 만든 노티파이를 사용하려면, 시퀸스 또는 몽타주를 연 다음 노티파이 트랙을 찾아 우클릭합니다. 새로 만든 노티파이가 맥락 메뉴 상단 부분에 나타날 것입니다.
블루프린트로 애니메이션 안에 약간의 로직을 돌리는 것도 괜찮지만, 위치, 색, 클래스 등 같이 작업을 할 수 있는 데이터를 블루프린트에 줄 수 없다면 할 수 있는 일이 제한될 것입니다. 다행히도 줄 수 있으며, 꽤나 간단한 프로세스입니다. 이 그래프 안에 생성된 변수는 시퀸스나 몽타주 편집시 페르소나에 노출되며, 페르소나에서 선택시 디테일 패널에 나타납니다:
불리언이나 인티저처럼 단순한 유형에서부터 좀 더 복잡한 액터 클래스에 이르기까지 블루프린트에 정상적으로 사용가능하면 어떠한 유형이든 노출시키는 데 사용할 수 있습니다. 다른 블루프린트와의 통신 방법 역시 애니메이션이 복잡한 이벤트 시퀸스를 발동시킬 수 있도록 작동합니다.
이벤트 노티파이
환경설정 가능한 데이터가 필요치 않고 한 스켈레톤 전용이라 (즉 여러 스켈레톤에 재사용되지 않아) 더 단순한 로직이 필요하다면 이벤트 노티파이가 더 나은 옵션이 될 수 있습니다. 블루프린트 노티파이 추가에 사용된 동일한 맥락 메뉴에 'New Notify' (새 노티파이)라는 옵션이 있습니다. 이 옵션은 데이터가 붙지 않고, 이름만 있는 트랙에 노티파이를 추가해 줍니다. 추가하고나면 루트 애니메이션 그래프 어느 곳에서든 해당 애니메이션을 재생 또는 평가중인 애니메이션 블루프린트는, 이벤트 그래프 내 이벤트처럼 그 노티파이에 접근하게 됩니다. 이러한 이벤트는 함수와 비슷한 방식으로 작동하며, 애니메이션에서 발동될 때마다 실행이 전달됩니다.
디폴트 노티파이
이 글 작성 시점에서 언리얼 엔진 4 의 에디터 내 Engine 콘텐츠 폴더에 사용할 수 있는 디폴트 블루프린트 노티파이가 둘, AnimNotify_PlayParticleEffect 와 AnimNotify_PlaySound 가 있습니다. 이 노티파이는 위에서 언급한 블루프린트 노티파이와 똑같은 방식으로 생성되었으며, 직접 커스텀 블루프린트 노티파이 셋업 작업을 하는 데 있어 뛰어난 시작점 또는 참고가 될 수 있습니다.
노티파이 스테이트
노티파이 스테이트는 약간 다르며, 특정 함수성에 대해 시작과 중지가 있으면 좋은 상황, 아니면 캐릭터가 어떤 작업을 하고있을 때 연속적인 업데이트 틱이 필요한 경우에 최적화되어 있습니다. 노티파이 스테이트 생성은 블루프린트를 파생시킬 클래스를 선택할 때 'AnimNotifyState' 를 선택한다는 점만 빼면 블루프린트 노티파이 생성시와 비슷합니다.
블루프린트 노티파이와 마찬가지로 노티파이의 함수성 역시도 이번엔 세 개의 함수, 'Received_NotifyBegin', 'Received_NotifyTick', 'Received_NotifyEnd' (시작, 틱, 끝)을 구현하는 것으로 생성합니다. '시작'과 '끝'은 노티파이 스테이트의 시작과 끝에서 호출되며, '틱'은 애니메이션이 노티파이 스테이트 안에 있을 때 매 프레임마다 호출됩니다.
노티파이는 그 안에 인스턴싱된 데이터를 저장할 수 없다는 점에서 일반 블루프린트와 비교할 때 명백한 한계점이 있습니다. 실질적으로 변수는 노티파이 안에서는 설정할 수는 없고, 노티파이 속으로 데이터를 전달하는 데만 사용 가능하다는 뜻입니다. 왜냐하면 노티파이는 애니메이션 시퀸스에 속하며, 해당 시퀸스를 재생하는 각 스켈레탈 메시는 같은 오브젝트를 레퍼런싱하기 때문입니다.
네이티브 애니메이션 노티파이
노티파이 이벤트를 처리는 블루프린트만 가능한 것이 아닙니다. 코드에서도 네이티브로 구현 가능합니다. UAnimNotify 또는 UAnimNotifyState 를 파생하거나 클래스 뷰어를 사용해서 수동으로 새 클래스를 생성해 주기만 하면 됩니다. 애니메이션 노티파이의 경우 단순히 Received_Notify 만 구현해 주면 되고, 애니메이션 노티파이 스테이트의 경우 Received_NotifyBegin, Received_NotifyTick, Received_NotifyEnd 를 구현합니다. 페르소나에서 네이티브 노티파이는 메뉴의 자체 섹션에 나타납니다:
블루프린트 노티파이와 마찬가지로, 네이티브 노티파이는 약간의 특수 문법이 필요하기는 하지만, 노티파이의 디테일 패널에서 변수를 설정하도록 노출시키는 것이 가능합니다. 노티파이 클래스 예제는 이렇습니다:
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' 메타데이터와 함께 디테일 패널에서 변수가 위치할 카테고리를 넣어줘야 합니다.
블루프린트 및 애니메이션 블루프린트 관련 상세 문서는 다음 문서를 참고해 주시기 바랍니다: 블루프린트, 애니메이션 블루프린트.
여러분께 유용한 정보였으면 좋겠습니다! 언제나처럼 질문이나 코멘트가 있으신 경우, 한글 네이버 카페, 영문 포럼 에 들러 말씀 남겨주시기 바랍니다.