AnimNotify

Animation 재생 중에는 다양한 이벤트가 발생한다. 단순히 뛰는 동작을 생각해보면 발이 지면에 닿을 때 발생하는 발자국 소리(sound) , 그에 따라 바닥에서 일어나는 먼지(effect)가 떠오를 것이다. AnimNotify는 이런 것들을 손쉽게 추가하도록 해준다.

발생

AnimNotify 가 발생되는 시점은 다음과 같다.

  • 시간의 흐름에 따라 time slide 가 AnimNotify 가 설치된 지점을 지나갈 때
    // UnAnimPlay.cpp
    void UAnimNodeSequence::AdvanceBy( FLOAT MoveDelta, FLOAT DeltaSeconds, UBOOL bFireNotifies )
    {
        ...
        IssueNotifies( MoveDelta );
        ...
    }
  • 시간의 역흐름에 따라 time slide 가 AnimNotify 가 설치된 지점을 지나갈 때
    // UnAnimPlay.cpp
    void UAnimNodeSequence::IssueNotifies( FLOAT DeltaTime )
    {
        ...
        if ( DeltaTime < 0.0f )
        {
            IssueNegativeRateNotifies( DeltaTime );   // IssueNotifies 함수 내에서 판단하여 위임
        }
        ...
    }
  • 에디터 상에서 time slide 를 조절할 때
    // 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 );
    ...
}

종류

AnimNotify_CameraEffect

AnimNotify_FootStep

AnimNotify_Kismet

AnimNotify_PlayParticleEffect

AnimNotify_Rumble

AnimNotify_Script

AnimNotify_Scripted

AnimNotify_ViewShake

AnimNotify_Sound

AnimNotify_Trails