2014年1月13日 星期一

Unity 4.3 之後,Animation 的 PingPong 到哪裡去了?

如果有常使用 Unity 的 Animation 製作物件動態或特效的人,應該都會覺得這是個很方便的工具,只要掛在 GameObject 上的 Component 有 public 欄位,幾乎都能利用 Animation view 建立 Animation Curve 來使該欄位的值隨曲線動態變化,而由這些 Animation Curve 組成的 Animation Clip 可以設定 Wrap Mode,使動畫可以 Loop 不斷重複循環或 PingPong 來回播放,但在 Unity 4.3 之後,Animation view 有些變化較大的更新,設定 Wrap Mode 的欄位竟然不見了,如此一來,使用 Unity 4.3 的使用者該如何使用 PingPong 的功能呢?


由於 Unity 4.3 發佈了 2D Tools 以及為 Animation 及 Animator 做了更進一步的整合,使得以往我們在 Animation view 為 GameObject 建立 Animation Clip 時,Unity 會自動為我們在 GameObject 掛上 Animation component 的行為變成了自動幫我們掛上 Animator component,使用者在 Animation view 的操作習慣也必須有所調整;而 Unity 並沒有因此而廢棄掉原本的 Animation component,所以將專案更新為 Unity 4.3 並不太會發生問題,可是當我們想使用到 PingPong 時,會發現到 Animation view 再也找不到那個設定選單了,那麼應該在哪裡設定呢?

Unity 4.2.2 以前的 Animation view
Unity 4.3 開始看不到 Wrap Mode 選單
比較有經驗的 Unity 使用者應該會知道,Animation Clip 檔案就有相關的設定欄位,但當我們在 Project view 點擊 Animation Clip 檔案會發現到 Inspector view 呈現的設定欄位也有很明顯的不同,同樣也沒有 Wrap Mode 欄位,雖然新的介面上預設已勾選 Loop time,想使動畫 Loop 重複循環不是問題,但似乎沒看到 PingPong 的相關設定。

Unity 4.2.2 以前也可以在 Inspector view 設置 Animaion Clip 的 Wrap Mode
Unity 4.3 的 Animation Clip 在 Inspector view 可以看見明顯的不同
此時,我們可以點開 Inspector View 右上角 Lock 旁的選單將 Inspector view 變更為 Debug view,這樣,終於看到 Wrap Mode 的設定欄位;

切換到 Debug view
在 Debug view 中將 Wrap Mode 變更為 PingPong
可是就算我們將 Wrap Mode 設為 PingPong,按下 Unity 上方的 Play 鍵來執行遊戲仍然沒有 PingPong 的效果,動畫播放依然不會來回播放,究竟問題出在哪裡呢?其實,關鍵就在於 Animation Type,回到剛剛的 Debug view 把 Animation Type 的 2 改為 1,再次執行遊戲試試,PingPong 的功能應該就會正常了。



Animation Clip 的 Animation Type 設定在 Unity 4.3 之前就已經有了,只是原本預設值是 1,所以在沒有特殊需求會去改到這個值的情況下,我們並不太會去注意到它,直到 Unity 4.3 開始,新建立的 Animation Clip 的 Animation Type 預設值變為 2,所以也使得 PingPong 失去效用;可見 Unity 4.3 已使新的動畫系統更加完善了,因此,還未開始使用 Unity 4.x 新動畫系統的使用者,要記得將 Animation Type 改回 1。

Unity 4.3 之前 Animation Type 預設值 1
Unity 4.3 以後 Animation Type 預設值 2
廢話一堆之後,整理一下步驟吧...

1. 在 Project view 點擊 Animation Clip 檔案。
2. 在 Inspector view 點開右上角 Lock 旁邊的選單。
3. 選擇 Debug。
4. 將 AnimationType 欄位設定為 1。
5. 將 WrapMode 欄位設定為 PingPong。
6. 確認 GameObject 上有 Animation component,並將該 Animation Clip 拉到 Animations 欄位上。
7. Play。

比較需要注意的是 GameObject 上究竟是有 Animation component 還是 Animator component 必須要先搞清楚,當 Animation Type 設為 1 時,即使 Animator view 已有該 Animation Clip,這個 Animation Clip 是沒辦法運作的,反之亦然,當 Animation Type 設為 2 時,即使 Animation component 已有該 Animation Clip,也是不會有動作的,當然這種使用錯誤的情形,在執行遊戲時,Console view 會有相關訊息顯示出來。

為什麼 Unity 4.3 會將動畫系統改成沒有 Wrap Mode 呢?

對於習慣使用原本的動畫系統的使用者應該會有這種疑問,特別是還沒開始使用新系統的人應該更為不解,答案就是已經沒有設置 Wrap Mode 的必要,因為只要做個簡單的 Animation Clip 就可以在 Animator view 中輕鬆的設計各種不同的 PingPong 動作,而且可視覺化的更方便於觀察狀態。

普通的 PingPong
速度變化的 PingPong