轉至:http://blog.csdn.net/miaoweiye/article/details/8559615
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綁定在需要移動的游戲對象身上。
01 |
using UnityEngine; |
02 |
using System.Collections; |
03 |
|
04 |
public class Move : MonoBehaviour |
05 |
{ |
06 |
|
07 |
void Start() |
08 |
{ |
09 |
|
10 |
//鍵值對兒的形式保存iTween所用到的參數 |
11 |
Hashtable args = new Hashtable(); |
12 |
|
13 |
//這里是設置類型,iTween的類型又很多種,在源碼中的枚舉EaseType中 |
14 |
//例如移動的特效,先震動在移動、先后退在移動、先加速在變速、等等 |
15 |
args.Add( "easeType" , iTween.EaseType.easeInOutExpo); |
16 |
|
17 |
//移動的速度, |
18 |
args.Add( "speed" ,10f); |
19 |
//移動的整體時間。如果與speed共存那么優先speed |
20 |
args.Add( "time" ,1f); |
21 |
//這個是處理顏色的。可以看源碼的那個枚舉。 |
22 |
args.Add( "NamedValueColor" , "_SpecColor" ); |
23 |
//延遲執行時間 |
24 |
args.Add( "delay" , 0.1f); |
25 |
//移動的過程中面朝一個點 |
26 |
args.Add( "looktarget" ,Vector3.zero); |
27 |
|
28 |
//三個循環類型 none loop pingPong (一般 循環 來回) |
29 |
//args.Add("loopType", "none"); |
30 |
//args.Add("loopType", "loop"); |
31 |
args.Add( "loopType" , "pingPong" ); |
32 |
|
33 |
//處理移動過程中的事件。 |
34 |
//開始發生移動時調用AnimationStart方法,5.0表示它的參數 |
35 |
args.Add( "onstart" , "AnimationStart" ); |
36 |
args.Add( "onstartparams" , 5.0f); |
37 |
//設置接受方法的對象,默認是自身接受,這里也可以改成別的對象接受, |
38 |
//那么就得在接收對象的腳本中實現AnimationStart方法。 |
39 |
args.Add( "onstarttarget" , gameObject); |
40 |
|
41 |
//移動結束時調用,參數和上面類似 |
42 |
args.Add( "oncomplete" , "AnimationEnd" ); |
43 |
args.Add( "oncompleteparams" , "end" ); |
44 |
args.Add( "oncompletetarget" , gameObject); |
45 |
|
46 |
//移動中調用,參數和上面類似 |
47 |
args.Add( "onupdate" , "AnimationUpdate" ); |
48 |
args.Add( "onupdatetarget" , gameObject); |
49 |
args.Add( "onupdateparams" , true ); |
50 |
|
51 |
// x y z 標示移動的位置。 |
52 |
|
53 |
args.Add( "x" ,5); |
54 |
args.Add( "y" ,5); |
55 |
args.Add( "z" ,1); |
56 |
|
57 |
//當然也可以寫Vector3 |
58 |
//args.Add("position",Vectoe3.zero); |
59 |
|
60 |
//最終讓改對象開始移動 |
61 |
iTween.MoveTo(gameObject,args); |
62 |
} |
63 |
|
64 |
//對象移動中調用 |
65 |
void AnimationUpdate( bool f) |
66 |
{ |
67 |
Debug.Log( "update :" + f); |
68 |
} |
69 |
//對象開始移動時調用 |
70 |
void AnimationStart( float f) |
71 |
{ |
72 |
Debug.Log( "start :" + f); |
73 |
} |
74 |
//對象移動時調用 |
75 |
void AnimationEnd( string f) |
76 |
{ |
77 |
Debug.Log( "end : " + f); |
78 |
} |
79 |
|
80 |
} |
在看看iTween中的尋路算法,其實非常非常的簡單,我們幾乎不用做任何事情。如下圖所示,我們能清楚的看到編輯了一個簡單的尋路,我們通過iTween 來實現小人跑步到終點。
Path.cs 綁在主角身上即可。
01 |
using UnityEngine; |
02 |
using System.Collections; |
03 |
|
04 |
public class Path : MonoBehaviour { |
05 |
|
06 |
//路徑尋路中的所有點 |
07 |
public Transform [] paths; |
08 |
|
09 |
void Start () |
10 |
{ |
11 |
Hashtable args = new Hashtable(); |
12 |
//設置路徑的點 |
13 |
args.Add( "path" ,paths); |
14 |
//設置類型為線性,線性效果會好一些。 |
15 |
args.Add( "easeType" , iTween.EaseType.linear); |
16 |
//設置尋路的速度 |
17 |
args.Add( "speed" ,10f); |
18 |
//是否先從原始位置走到路徑中第一個點的位置 |
19 |
args.Add( "movetopath" , true ); |
20 |
//是否讓模型始終面朝當面目標的方向,拐彎的地方會自動旋轉模型 |
21 |
//如果你發現你的模型在尋路的時候始終都是一個方向那么一定要打開這個 |
22 |
args.Add( "orienttopath" , true ); |
23 |
|
24 |
//讓模型開始尋路 |
25 |
iTween.MoveTo(gameObject,args); |
26 |
} |
27 |
|
28 |
void OnDrawGizmos() |
29 |
{ |
30 |
//在scene視圖中繪制出路徑與線 |
31 |
iTween.DrawLine(paths,Color.yellow); |
32 |
|
33 |
iTween.DrawPath(paths,Color.red); |
34 |
|
35 |
} |
36 |
|
37 |
} |
運行后即可看到主角自動尋路的效果。
如果你仔細閱讀到這里你可能會想到,iTween做的東西有點像 Mathf.Lerp() Vector3
.Lerp() lookAt()等等這類的方法。假設不使用iTween這個類就用源生的API其實也可以實現上述的所有效果。只有iTween幫我們封裝的更好一些,平滑過渡的效果更好一些,而且還能增加一些特效。只是這些特效與動畫全都是iTween通過數學的方法計算出來。因為底層它們使用的也是簡單的 移動旋轉API中的方法。我覺得尋路的話可以使用Unity自帶的方法(因為是官方提供的),處理一些簡單的動畫使用iTween還是挺不錯的,因為更加形象。