Animation 재생 중에는 다양한 이벤트가 발생한다. 단순히 뛰는 동작을 생각해보면 발이 지면에 닿을 때 발생하는 발자국 소리(sound) , 그에 따라 바닥에서 일어나는 먼지(effect)가 떠오를 것이다. AnimNotify는 이런 것들을 손쉽게 추가하도록 해준다.
AnimNotify 가 발생되는 시점은 다음과 같다.
// UnAnimPlay.cpp void UAnimNodeSequence::AdvanceBy( FLOAT MoveDelta, FLOAT DeltaSeconds, UBOOL bFireNotifies ) { ... IssueNotifies( MoveDelta ); ... }
// UnAnimPlay.cpp void UAnimNodeSequence::IssueNotifies( FLOAT DeltaTime ) { ... if ( DeltaTime < 0.0f ) { IssueNegativeRateNotifies( DeltaTime ); // IssueNotifies 함수 내에서 판단하여 위임 } ... }
// UnAnimPlay.cpp void UAnimNodeSequence::SetPosition( FLOAT NewTime, UBOOL bFireNotifies ) { ... IssueNotifies( DeltaTime ); ... }
위 세 경우 모두 IssueNotifies 함수가 호출되고 (역흐름은 제외) 그 내용은 아래와 같다.
void UAnimNodeSequence::IssueNotifies( FLOAT DeltaTime ) { ... // 역흐름 처리 IssueNegativeRateNotifies( DeltaTime ); ... // 다음 AnimNotify 대상 획득 ... if ( TryTimeToNotify < TimeToNextNotify ) { TimeToNextNotify = TryTimeToNotify; NextNotifyIndex = i; WorkTime = NotifyEventTime; } ... // Notify Duration 이 있는 녀석들의 Tick ... if ( AnimNotify != NULL ) { ... AnimNotify->NotifyTick( ... ); if ( CurrentTime + DeltaTime >= AnimNotifyEndTime ) { AnimNotify->NotifyEnd( ... ); } ... } // 대상 AnimNotify 를 지나갔다면 이벤트 발생 ... AnimNotify->Notify( this ); ... }