最近項目中需要加入一些模型移動的小動畫,學習過程中發現了iTween這個類庫。它主要的功能就是處理模型從起始點到結束點之間運動的軌迹。(移動,旋轉,音頻,路徑,錄影機等)它是一個開源的項目并且完全免費,它們的官網在這裡 http://itween.pixelplacement.com/index.php 打開網之後點選右上角Get iTween圖示即可,或者在AssetStores商店中直接下載下傳。 我把iTween的源碼仔細讀了一遍,我感覺與其說它是處理動畫的類,不如說它是處理數學的類。本文的最後,我會像大家總結,請仔細閱讀。
移動模型時候用到的幾個核心方法如下:
iTween.MoveTo(): 讓模型移動到一個位置,它的底層函數是通過動态的修改模型每一幀的transform.position完成的,是以它會百分之百到達目标點,不會出現誤差。
iTween.MoveFrom():它和上面的一樣,iTween.MoveTo()是将模型移動到目标位置,而iTween.MoveFrom()是将模型從目标位置移動到原始位置。
iTween.MoveAdd() 和iTween.MoveBy()底層實作一樣,大家可以去看源碼。處理移動時采用的是transform.Translate也就是API的平移,這樣在處理移動的時候可能會出現一些誤差,但是效果好點。
iTween.MoveUpdate():和iTween.MoveTo()差不多,隻是它需要放在循環或者Update()中。
有了核心的移動方法後,我們就來了解iTween強大的核心參數,與事件。移動方法的參數都差不多,是以這裡我就以MoveTo來做例子。直接上代碼。
Move.cs綁定在需要移動的遊戲對象身上。
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 | using UnityEngine ; using System . Collections ; public class Move : MonoBehaviour { void Start ( ) { //鍵值對兒的形式儲存iTween所用到的參數 Hashtable args = new Hashtable ( ) ; //這裡是設定類型,iTween的類型又很多種,在源碼中的枚舉EaseType中 //例如移動的特效,先震動在移動、先後退在移動、先加速在變速、等等 args . Add ( "easeType" , iTween . EaseType . easeInOutExpo ) ; //移動的速度, args . Add ( "speed" , 10f ) ; //移動的整體時間。如果與speed共存那麼優先speed args . Add ( "time" , 1f ) ; //這個是處理顔色的。可以看源碼的那個枚舉。 args . Add ( "NamedValueColor" , "_SpecColor" ) ; //延遲執行時間 args . Add ( "delay" , 0.1f ) ; //移動的過程中面朝一個點 args . Add ( "looktarget" , Vector3 . zero ) ; //三個循環類型 none loop pingPong (一般 循環 來回) //args.Add("loopType", "none"); //args.Add("loopType", "loop"); args . Add ( "loopType" , "pingPong" ) ; //處理移動過程中的事件。 //開始發生移動時調用AnimationStart方法,5.0表示它的參數 args . Add ( "onstart" , "AnimationStart" ) ; args . Add ( "onstartparams" , 5.0f ) ; //設定接受方法的對象,預設是自身接受,這裡也可以改成别的對象接受, //那麼就得在接收對象的腳本中實作AnimationStart方法。 args . Add ( "onstarttarget" , gameObject ) ; //移動結束時調用,參數和上面類似 args . Add ( "oncomplete" , "AnimationEnd" ) ; args . Add ( "oncompleteparams" , "end" ) ; args . Add ( "oncompletetarget" , gameObject ) ; //移動中調用,參數和上面類似 args . Add ( "onupdate" , "AnimationUpdate" ) ; args . Add ( "onupdatetarget" , gameObject ) ; args . Add ( "onupdateparams" , true ) ; // x y z 标示移動的位置。 args . Add ( "x" , 5 ) ; args . Add ( "y" , 5 ) ; args . Add ( "z" , 1 ) ; //當然也可以寫Vector3 //args.Add("position",Vectoe3.zero); //最終讓改對象開始移動 iTween . MoveTo ( gameObject , args ) ; } //對象移動中調用 void AnimationUpdate ( bool f ) { Debug . Log ( "update :" + f ) ; } //對象開始移動時調用 void AnimationStart ( float f ) { Debug . Log ( "start :" + f ) ; } //對象移動時調用 void AnimationEnd ( string f ) { Debug . Log ( "end : " + f ) ; } } |
在看看iTween中的尋路算法,其實非常非常的簡單,我們幾乎不用做任何事情。如下圖所示,我們能清楚的看到編輯了一個簡單的尋路,我們通過iTween 來實作小人跑步到終點。

Path.cs 綁在主角身上即可。
C#
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 | using UnityEngine ; using System . Collections ; public class Path : MonoBehaviour { //路徑尋路中的所有點 public Transform [ ] paths ; void Start ( ) { Hashtable args = new Hashtable ( ) ; //設定路徑的點 args . Add ( "path" , paths ) ; //設定類型為線性,線性效果會好一些。 args . Add ( "easeType" , iTween . EaseType . linear ) ; //設定尋路的速度 args . Add ( "speed" , 10f ) ; //是否先從原始位置走到路徑中第一個點的位置 args . Add ( "movetopath" , true ) ; //是否讓模型始終面朝當面目标的方向,拐彎的地方會自動旋轉模型 //如果你發現你的模型在尋路的時候始終都是一個方向那麼一定要打開這個 args . Add ( "orienttopath" , true ) ; //讓模型開始尋路 iTween . MoveTo ( gameObject , args ) ; } void OnDrawGizmos ( ) { //在scene視圖中繪制出路徑與線 iTween . DrawLine ( paths , Color . yellow ) ; iTween . DrawPath ( paths , Color . red ) ; } } |
運作後即可看到主角自動尋路的效果。
如果你仔細閱讀到這裡你可能會想到,iTween做的東西有點像
Mathf.Lerp() Vector3
.Lerp() lookAt()等等這類的方法。假設不使用iTween這個類就用源生的API其實也可以實作上述的所有效果。隻有iTween幫我們封裝的更好一些,平滑過渡的效果更好一些,而且還能增加一些特效。隻是這些特效與動畫全都是iTween通過數學的方法計算出來。因為底層它們使用的也是簡單的 移動旋轉API中的方法。我覺得尋路的話可以使用Unity自帶的方法(因為是官方提供的),處理一些簡單的動畫使用iTween還是挺不錯的,因為更加形象。
代碼下載下傳位址:http://vdisk.weibo.com/s/omt5Q
這幾天我還會把剩下的一些iTween的學習心得寫在部落格中,希望大家踴躍留言互相學習,互相進步。嘻嘻。
- 本文固定連結: http://www.xuanyusong.com/archives/2052
- 轉載請注明: 雨松MOMO 2013年01月23日 于 雨松MOMO程式研究院 發表