1. 程式人生 > >Unity3D Animator 動態新增事件回撥和替換動畫

Unity3D Animator 動態新增事件回撥和替換動畫

     主要的層次結構式是, Animator 包含一個 AnimatorStateController 控制器, Controller 含有多個層,每個層含有多個狀態, 每個狀態可以繫結一個AnimationClip。執行動畫的是AnimationClip , 可以掛在回撥事件的也是AnimationClip。所以,動態掛在事件回撥,我們需要獲取AnimationClip。

					AnimationEvent aEvent1 = new AnimationEvent();
					aEvent1.time           = clip.length;
					aEvent1.functionName   = "OnOpenComplete";  
					clip.AddEvent(aEvent1);

以上是動態建立一個事件回撥,然後掛在到AnimationClip上的方法。AnimationEvent的 time就是動畫的時間,這裡賦值clip的length表示,動畫執行完成後回撥。那麼回撥函式式一個字串,是通過訊息機制回撥,當前clip所在GameObject上的一個函式名來呼叫。

有兩個辦法,從Animator裡面拿到AnimationClip。

第一, Controller 裡面包含多個 AnimationClip 可以通過 Controller的陣列animationClips 拿到所有的clip。

第二, 把掛載在Controller上的clip直接掛載到GameObject上當屬性獲得。

值得注意的是,經過測試,掛載clip事件的函式,一定要放到Animator的play或是設定相關屬性之前。Animator才能播放。Play方法,有多個過載,其中有一個可以傳入StateName通過名字,來直接播放特定的狀態動畫。而不是走預設狀態切換流程。這樣,我們可以再配置Controller的時候,就設定一個預設的狀態,其他的狀態都懸空,用程式碼來手動呼叫,而不是通過狀態條件來自動處理。 既然,controller裡面的clip是掛載的,那麼執行時也是有方法可以修改的。
AnimatorOverrideController overrideController = new AnimatorOverrideController();
overrideController.runtimeAnimatorController  = anim.runtimeAnimatorController;
overrideController["clipName"]  = newClip;
anim.runtimeAnimatorController = overrideController;

clipName 就是原來AnimationClip的name, 這樣可以動態的替換掉播放的動畫。