【iTween】单点移动和旋转

发表于2017-08-12
评论0 3.8k浏览

在Unity3D实现移动和选择本身就很容易,一个Transform.Translate/Rotate则可以完成,但问题是在整个过程unity3d几乎可以说没有动画,或者说表现移动和旋转动画量不够。此时需要用到iTween这个插件让Unity3D中的3D问题的移动和旋转更加炫。

iTween本身就是一个免费插件,但是由于我的Unity3D是和谐版的Unity3D,所以不能使用Asset Store,因此只能导入.unitypackage。大家可以看到其体积很少。导入之后,这个插件注意到是没有任何预设的,只是你可以在你的脚本中使用到iTween这个类,它只是将复杂的动画处理封装起来,很多东西都是基于Unity3D原生。


一般这插件多用来做路径动画,不过iTween的最基本单点移动和旋转也是很常用的,让我们实现一个组件的移动和旋转不至于写这么多代码。

一、单点移动

导入了iTween之后,给一个在(-4,-4,0)赋予如下的脚本Move.cs:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Move : MonoBehaviour  
  5. {  
  6.   
  7.     void Start()  
  8.     {  
  9.         Hashtable args = new Hashtable();//iTween所用到的参数需要存入一个Hashtable键值对  
  10.         args.Add("easeType", iTween.EaseType.easeOutCirc);//动画类型  
  11.         args.Add("time", 3f);//动画整体时间。如果与speed共存那么优先speed。//args.Add("speed", 10f);  
  12.         args.Add("delay", 0.5f);//延迟执行时间  
  13.         args.Add("looktarget", Vector3.zero);//移动的过程中面朝一个点  
  14.         args.Add("loopType""pingPong");//三个循环类型 none loop pingPong (一般 循环 来回)  
  15.   
  16.         /*处理移动过程中的事件*/  
  17.         //开始发生移动时调用AnimationStart函数,5.0表示传入AnimationStart的参数  
  18.         args.Add("onstart""AnimationStart");  
  19.         args.Add("onstartparams", 5.0f);  
  20.   
  21.         //移动中调用AnimationUpdate函数,传入true参数  
  22.         args.Add("onupdate""AnimationUpdate");  
  23.         args.Add("onupdateparams"true);  
  24.   
  25.         //移动结束时调用AnimationComplete函数,传入"end"参数  
  26.         args.Add("oncomplete""AnimationEnd");  
  27.         args.Add("oncompleteparams""end");  
  28.   
  29.         args.Add("position"new Vector3(5, 5, 1));//单点移动的终点  
  30.   
  31.         iTween.MoveTo(gameObject, args);//让gameObject,也就是脚本被赋予者,执行这些参数下的iTween  
  32.     }  
  33.   
  34.     //对象开始移动时调用  
  35.     void AnimationStart(float onstartparams)  
  36.     {  
  37.         Debug.Log("传入参数 :"   onstartparams);  
  38.     }  
  39.   
  40.     //对象移动中调用  
  41.     void AnimationUpdate(bool onupdateparams)  
  42.     {  
  43.         Debug.Log("传入参数 :"   onupdateparams);  
  44.     }  
  45.   
  46.     //对象移动时调用  
  47.     void AnimationComplete(string oncompleteparams)  
  48.     {  
  49.         Debug.Log("传入参数 :"   oncompleteparams);  
  50.     }  
  51.   
  52. }  

将看到如下的效果:


所有iTween的参数都写在MAP、hashtable这个存键值对的数据字典args里面了。

这个Cube的位移动作将在3s内完成。由于循环过程设置成pingPong而不是loop与none,所以这个Cube将在结束与开始位置来回上演iTween.EaseType.easeOutCirc这个动画。none的话只位移到结束位置就停止很好理解,pingPong与loop的区别是,loop会在每次结束秒回开始的位置重新一次动画,而pingPong大家可以看到它是一个不会触发oncompleteparams iTween动画结束事件的,它是一个不停在开始结束位置循环的动画,而动画运行事件onupdateparams一直别调用。这几个函数与下面三个函数是详对应的。只有loop与none才有可以读完3个函数的。

至于动画类型iTween.EaseType.XX可以直接参考iTween的官方API:http://robertpenner.com/easing/easing_demo.html,这个API怎么看的,说明一下,比如这里用到的iTween.EaseType.easeOutCirc:


可以看到官方API给出了一个函数,XY轴表示的东西如上图所示,这里iTween.EaseType.easeOutCirc的位移-时间(s-t)是一个凸函数,那么就意味着,速度一开始很快,然后慢慢收尾。再不能理解,你在这条函数不停做切线,求切线斜率,你会发现切线慢慢平衡于X轴,然后斜率慢慢变成0,也就是速度慢慢变成0,因为s'=v啊!

二、旋转

如果对于一个(0,0,0)的cube,赋予以下的Rotate.cs脚本:

  1. using UnityEngine;  
  2. using System.Collections;  
  3.   
  4. public class Rotate : MonoBehaviour  
  5. {  
  6.   
  7.     void Start()  
  8.     {  
  9.         Hashtable args = new Hashtable();//键值对的形式保存iTween所用到的参数   
  10.         args.Add("rotation"new Vector3(0, 180, 0));//旋转的角度,也可以写成args.Add("y",180);  
  11.         args.Add("time", 1f);//动画的时间  
  12.         args.Add("delay", 0.1f);//延迟执行时间   
  13.         args.Add("easeType", iTween.EaseType.easeInOutExpo);//动画类型  
  14.         args.Add("loopType""loop");//循环类型  
  15.   
  16.         iTween.RotateTo(gameObject, args);//执行动画  
  17.     }  
  18.   
  19. }  
则能看到如下效果:

上面脚本关键就是args.Add("rotation", new Vector3(0, 180, 0));。表示要求这个脚本赋予者的Rotation属性y 180,也就是绕y轴旋转180度。

这里不使用pingPong类型循环,而用loop,意思是,做完一次之后即可停止,下一次循环继续绕y轴旋转180度。

同时说明以下,iTween同样支持oncompleteparams等,要求在动画开始、执行、结束过程中,调用某某函数的指明。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引

标签: