转载:http://www.xuanyusong.com/archives/2052
最近项目中需要加入一些模型移动的小动画,学习过程中发现了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绑定在需要移动的游戏对象身上。
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 来实现小人跑步到终点。