2012年3月8日 星期四

自訂動畫事件

在播放骨架動畫時,AnimNotify用來讓開發者在指定的時間觸發事件。例如:
  • AnimNotify_Sound可用來播放音效
  • AnimNotify_PlayParticleEffect可用來播放粒子特效

開發者可以自行擴充AnimNotify系統,透過繼承AnimNotify類別體系就可以自訂動畫事件。編輯器會偵測所有的AnimNotify,所以不需修改編輯器的原始碼就可看到新增的動畫事件。AnimNotify是存放在AnimSequence裡,所以不同模型實例播放同一個動畫時用的是相同的AnimNotify,這點在撰寫AnimNotify時要特別留意。

範例


以下是一個可以改變物理模式的AnimNotify的例子:
class AnimNotify_SetPhysics extends AnimNotify_Scripted;

/** New Physics to set on notify. */
var() EPhysics Physics;

event Notify(Actor Owner, AnimNodeSequence AnimSeqInstigator)
{
    if( Owner != none )
    {
        Owner.SetPhysics(Physics);
    }
}

defaultproperties
{
    NotifyColor=(R=200,G=200,B=200,A=255)
}
當事件觸發時會呼叫AnimNotify_Scripted::event Notify(),然後呼叫SetPhysics()改變Actor的物理模式。

另外要注意在AnimSetViewer裡是只有模型而沒有Actor的,所以無法預覧SetPhysics()的結果,因此要在Notify事件裡檢查Actor是否為none。

AnimNotify_Scripted類別


上例中的AnimNotify_Scripted類別是讓開發者使用UnrealScript就可以自訂新的AnimNotify。

實際上動畫事件的基礎類別是AnimNotify,不過它是原生類別,要直接擴充它需要寫C++,沒有原始碼授權是做不到的。動畫事件觸發時會呼叫虛擬函式Notify(),AnimNotify_Scripted覆寫了虛擬函式Notify()去呼叫自己的Notify事件。AnimNotify_Scripted會檢查有Owner才會呼叫Notify事件,但是只有在遊戲中或PIE才會有Owner,在AnimSetViewer裡是只有模型沒有Owner的,所以AnimNotify_Scripted無法實作預覽功能。

期間


其實AnimNotify的事件是可持續一段時間的。如果它的Duration屬性大於零,會在每個frame呼叫AnimNotify::NotifyTick(),然後結束時呼叫AnimNotify::NotifyEnd()。AnimNotify_Trails就有使用到這兩個函式。

AnimNotify_Scripted並不提供NotifyTick事件。

沒有留言:

張貼留言