最近项目中需要加入一些模型移动的小动画,学习过程中发现了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 81 82 |
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 绑在主角身上即可。
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 |
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的学习心得写在博客中,希望大家踊跃留言互相学习,互相进步。嘻嘻。
- 本文固定链接: https://www.xuanyusong.com/archives/2052
- 转载请注明: 雨松MOMO 于 雨松MOMO程序研究院 发表
好东西,赞~!
以前一直觉得itween这个东西比较耗性能,所以即便做路径动画也还是在maya里面做好路径动画再导到u3d里的。现在看了momo大神的文章以后发现itween的底层还是transform.Translate所以其实对性能的影响应该也不会很大吧?
请问NGUI中有曲线运动的控件吗?我只知道Animation可以实现,但这个制作有点麻烦,或者说有没有其他更高效的方法?
NGUI里面有 UITween
不是哦,UITween只能控制from到to的位置移动的吧?我想要的是不是直线的运动
不是哦,UITween只能控制from到to的位置移动的吧?我想要的不是直线的运动
这个动画结束后会自己调用 AnimationEnd函数吗?不然怎么判断他结束?
要设置回调的方法。
要角色能躲避动态障碍物的移动 用这个可以做吗 不想用A星算法
用unity自带的寻路算法吧。。
我用iTween的MoveTo移动NGUI里面的Panel,为什么不行啊?iTween的脚本附加上去了,但是没有移动。
momo出现个问题,itween最大支持10个点,我修改源代码让他支持100个点,然后我加了30个点,来问题了,以前物体运动方向还会沿着路径,现在物体拐弯就跟漂移是的,就是说,还没到拐弯的地方,物体前方已经指向大约之后两个点的位置了,怎么会这样呢?而且,我在拼两段路径的时候,在结合的地方,物体会有个突然的转向,然后再延路径2移动。还有,speed不怎么管用,他与两点之间的距离应没关系吧?
最近在用itween进行路径编辑,想问一下,这样编辑的路径像拐弯处都是圆滑的,如果我就想直来直去的拐弯,这个可以实现吗?或者应该怎么做?
自己查吧,momo大大也不是這麼閒的哩
能不能把那几个 easyType的方式说下,英文不好不知道都是干什么用的
感谢momo
https://www.youtube.com/watch?v=ZUgy9MJzGjg…
Related?…
请问MOMO,怎么突然改变对象的速度呢?放update()里面好象不行吧?还有就是怎么让对象停止,而后过段时间继续寻路?iTween.stopbyname()里面的参数名字是什么呢?望解答,谢谢!
感谢雨松momo,我最近也在搞人物动画这块,望尽快分享下一教程
人物动画? 什么样的动画呢?
也是寻路,还有就是人物对突发情况处理,有了iTween基本差不多了,骨骼主要还是美工的事。
Assets/Lightbeam/Scripts/Editor/LightbeamEditor.cs(264,31): error CS0117:
Path' does not contain a definition for
GetDirectoryName’ 是怎么回事啊?不要意思,没动脑筋就来问了,占用资源了
蛤蛤。。
文章非常棒!!
过奖啦。
嗯,很有用,马上就要涉及到这一块了,多谢MOMO老师蛤
蛤蛤 过奖了 小伙子。
这博客很给力!
其实可以直接这样用(下面是我的写的代码): iTween.MoveTo(cameraFront, iTween.Hash(“path”, Tran_pathPoint, “easetype”, “linear”, “speed”, 3, “movetopath”, false, “orienttopath”, true, “looktarget”, pathpoints[points – 1], “looktime”, 0.1f, “delay”, 0.5f, “lookahead”, 0.01f, “islocal”, false, “oncomplete”, “Walked”, “oncompletetarget”, gameObject));不过我用这个的时候出现一个问题,它不是直线的运动,会有所偏移,但我想要他按照完全路线走。
自己调用自己吧? 我觉得寻路这块 没必要用itween unity3.5已经带寻路的方法。。
这不是寻路,是按照设定的几个点走,没有遮挡的。
momo什么时候弄点视频啊中文视频好少几乎没有
蛤蛤。。 有空的话就会录制。。 感谢你的支持。
期待你的视频,不要让大家伙等太久哦呵呵