DoTween全解析

DoTween全解析

概述:

DoTween,Itween,这些名字作为一个Unity开发人员听起来并不陌生,它们在动画方面表现出了令人折服的能力,今天我带着大家来一起认识一下这款插件。

           

首先我先给大家提前说明的一个概念就是,千万不要觉得动画插件好像是不是只能用在ui上面,其实不是的啊,就DoTween来说,它的用途很广泛,不仅仅只是用在了UI上面,在3D游戏中控制怪物,或者其他物体的移动也可以使用,并且DoTween与其他动画插件相比,它的效率是最高的

一 先来学习一个入门级的DoTween小例子:

使用DoTween控制Cube位移和简单UI元素位移(Cube可以看做是游戏项目中的人物/NPC/Monster,UI就是可以想象成你的项目中那些需要做动画的UI元素!):

第一步  还是先搭建好场景,场景中有一个Cube和一个UI控件(使用的UGUI)



好了接下来我们写DoTween代码实现,①cube从中间移动到边缘,②UI空间从上边移动下来,在此之前,我们看一个DoTween小语法,结合Lambda表达式的移动代码

[csharp]  view plain  copy
  1. DOTween.To(() => mPosVector3, x => mPosVector3 = x, new Vector3(5f,0.5f, 0f), 2);//固定写法 也称匿名函数  


上面代码实现了一个Vector3变量从(0,0,0)变化到(10,10,10)的过程。接着我们实现游戏物体Cube和UI控件的位移动画。

Cube:

[csharp]  view plain  copy
  1. private Vector3 mPosVector3;  
  2.   
  3. void Start()  
  4. {  
  5.     UseDoTween();  
  6. }  
  7.   
  8.   
  9. void Update()  
  10. {  
  11.     this.transform.localPosition= mPosVector3;  
  12. }  
  13.   
  14. void UseDoTween()  
  15. {  
  16.     DOTween.To(() => mPosVector3, x => mPosVector3 = x, new Vector3(5f,0.5f, 0f), 2);//固定写法 也称匿名函数  
  17. }  


UI:

[csharp]  view plain  copy
  1. private Vector3 mPosVector3;  
  2.   
  3. void Start()  
  4. {  
  5.     UseDoTween();  
  6. }  
  7.   
  8.   
  9. void Update()  
  10. {  
  11.     this.transform.localPosition = mPosVector3;//移动本地坐标    
  12. }  
  13.   
  14. void UseDoTween()  
  15. {  
  16.     DOTween.To(() => mPosVector3, x => mPosVector3 = x, new Vector3(-6f, -88f, 0f), 1);//固定写法 也称匿名函数  
  17. }  


(这里有个Unity坐标的问题,所有层次面板中显示的且没有父级物体的他们的坐标为世界坐标=绝对坐标,所有层次面板中父级底下游戏物体的坐标为相对坐标=局部坐标)


移动效果:


最后实现了移动,但是发现移动过程有抖动现象,但是速度加快就没有,不知道大家测试有没有这种现象。好,那我们上面用的是Lambda表达式做的动画移动,这样用起来 还是不是很好,反正我用着不是很舒服,那么接下来我们看看其他的几种动画移动方式。

创建一个用来控制动画播放的按钮,如图:



那现在我们要实现一个功能需求就是:比如点击按钮播放动画,再点击按钮动画撤回。这个需求怎么实现,那我们就需要分析一下DoTween插件给我们封装好的函数了。

需求分析:①点击按钮播放动画:判断动画类型,②再点击动画,动画倒放,考虑DoTween中是否有类似PlayReverse的函数,③同样一个button竟然能够实现两种不同的效果,考虑是否需要标志位/枚举标签。

需求分析完毕,这样我们的思路不就有了吗?这样写代码就比较好写了!

[html]  view plain  copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using DG.Tweening;//注意命名空间引入  
  4. using DG.Tweening.Plugins.Options;//注意命名空间引入  
  5.   
  6. public class PlayDoTweenAnimation : MonoBehaviour  
  7. {  
  8.   
  9.     public RectTransform mRectTransform;  
  10.     private bool isFrist = false;//动画是否第一次播放  
  11.     private bool isSecond = false;//动画是否第二次播放  
  12.   
  13.     private Tweener mTweener;//我的动画片段  
  14.     void Start()  
  15.     {  
  16.     }  
  17.   
  18.     /// <summary>  
  19.     /// 点击播放按钮播放动画  
  20.     /// </summary>  
  21.     public void OnClick()  
  22.     {  
  23.         if (isFrist == false)//表示动画是第一次播放  
  24.         {  
  25.             PlayImage();  
  26.             isFrist = true;  
  27.         }  
  28.         else  
  29.         {  
  30.             mTweener.PlayBackwards();//不是第一次播放了就倒放  
  31.             isFrist = false;  
  32.         }  
  33.     }  
  34.   
  35.     void PlayImage()  
  36.     {  
  37.         //这种方式错误的,因为DOMove没有适用于Vector3类型的方法  
  38.         //mRectTransform.localPosition.DOMove(new Vector3(-6, -88, 0), 0.4f);  
  39.        mTweenermRectTransform.DOLocalMove(new Vector3(-6, -88, 0), 0.3f);  
  40.         mTweener.SetAutoKill(false);//不要让他播放完事就自动自杀  
  41.     }  
  42. }  

这样的代码运行之后,看测试效果,我们确实实现了功能需求,但是,但我们把目光聚焦在这个东西上面的时候,就发现制约性能瓶颈的东西来了=每次点击为我们重复创建了不少Tweener!


这个问题的处理方式,首先我们要思考问题的来源?很显然问题出现在这几行代码中:

[html]  view plain  copy
  1. void PlayImage()  
  2. {  
  3.     //这种方式错误的,因为DOMove没有适用于Vector3类型的方法  
  4.     //mRectTransform.localPosition.DOMove(new Vector3(-6, -88, 0), 0.4f);  
  5.    mTweenermRectTransform.DOLocalMove(new Vector3(-6, -88, 0), 0.3f);  
  6.     mTweener.SetAutoKill(false);//不要让他播放完事就自动自杀  
  7. }  

当我们每次调用这个函数的时候,由于我们SetAutoKill==false了,所以我们每次调用都在创建一个Tweener,解决方案就是只创建一次Tweener,后面使用这个创建出来的Tweener就好,如何实现?看代码:

[csharp]  view plain  copy
  1. using UnityEngine;  
  2. using System.Collections;  
  3. using DG.Tweening;//注意命名空间引入  
  4. using DG.Tweening.Plugins.Options;//注意命名空间引入  
  5.   
  6. public class PlayDoTweenAnimation : MonoBehaviour  
  7. {  
  8.   
  9.     public RectTransform mRectTransform;  
  10.     private bool isFrist = false;//动画是否第一次播放  
  11.     private bool isSecond = false;//动画是否第二次播放  
  12.   
  13.     private Tweener mTweener;//我的动画片段  
  14.     void Start()  
  15.     {  
  16.         //①将Tweener的创建放在Start函数中  
  17.         PlayImage();  
  18.     }  
  19.   
  20.     /// <summary>  
  21.     /// 点击播放按钮播放动画  
  22.     /// </summary>  
  23.     public void OnClick()  
  24.     {  
  25.         if (isFrist == false)//表示动画是第一次播放  
  26.         {  
  27.             mTweener.PlayForward();  
  28.             isFrist = true;  
  29.         }  
  30.         else  
  31.         {  
  32.             mTweener.PlayBackwards();//不是第一次播放了就倒放  
  33.             isFrist = false;  
  34.         }  
  35.     }  
  36.   
  37.     void PlayImage()  
  38.     {  
  39.         //这种方式错误的,因为DOMove没有适用于Vector3类型的方法  
  40.         //mRectTransform.localPosition.DOMove(new Vector3(-6, -88, 0), 0.4f);  
  41.        mTweener= mRectTransform.DOLocalMove(new Vector3(-6, -88, 0), 0.3f);  
  42.         mTweener.Pause();//②.由于我们将Tweener的创建放在了Start中所有为了避免游戏一运行自动播放,所以暂停  
  43.         mTweener.SetAutoKill(false);//不要让他播放完事就自动自杀  
  44.     }  
  45. }  


好了这样我们就实现了一个不消耗性能的暂停/播放动画的方式了。

二 FromTweens 

关键字:From:来自,从哪

FromTweens到底是干嘛用的呢?从名字上面我们可以猜到从哪来的动画,来自哪的动画?通过下面的例子学习,我们将对FromTweens这个新的知识点有更加深刻地理解!

在Cube上面挂载这个脚本,脚本中代码:

[csharp]  view plain  copy
  1. void Start ()  
  2. {  
  3.     this.transform.DOMoveX(5, 0.3f,false);//从cube当前位置移动到X=5的坐标位置  
  4. }  

修改后:

[csharp]  view plain  copy
  1. void Start ()  
  2. {  
  3.     this.transform.DOMoveX(5, 0.3f).From();//加上from表示从X=5的坐标位置移动到cube最初始位置  
  4. }  
From()的参数

[csharp]  view plain  copy
  1. void Start ()  
  2. {  
  3.     this.transform.DOMoveX(5, 2f).From(true);//加上True之后,表示移动过来的X=current.pos+5;  
  4. }  

三 动画参数讲解动画练习


学习目标:了解动画参数,动画的学习和使用

通过小例子来学习如何修改动画曲线(easy enum)以及掌握如何在动画结束之后通知某些需要处理的事件,我们还是拿之前的UI控件来学习。

新建一个EasyTypeTest脚本,挂载在UI控件身上

[csharp]  view plain  copy
  1. public class EasyTypeTest : MonoBehaviour {  
  2.   
  3.     void Start ()  
  4.     {  
  5.        Tweener myTweener= this.transform.DOLocalMoveY(-88, 3f);//返回一个Tweener对象,所有的修改围绕这个返回值  
  6.         myTweener.SetEase(Ease.InBack);//修改动画曲线类型  
  7.         myTweener.OnComplete(OnCompleteHandler);  
  8.     }  
  9.   
  10.   
  11.     void OnCompleteHandler()  
  12.     {  
  13.         Debug.Log("动画播放完毕了");  
  14.     }  
  15. }  

当动画播放完毕之后才会去调用OnComplete.



动画的生命周期和生命函数,在官放document中有很多介绍。接下来我们继续使用DoTween来做其他效果,比如对于UI文字

[csharp]  view plain  copy
  1. public class TextTest : MonoBehaviour  
  2. {  
  3.   
  4.     private Text mText;  
  5.     void Start ()  
  6.     {  
  7.         mText = this.GetComponent<Text>();  
  8.         DoTweenTextAnim();  
  9.     }  
  10.   
  11.     void DoTweenTextAnim()  
  12.     {  
  13.         mText.DOText("you are a good man,see you tomorrow,I love you.", 2f);  
  14.     }  
  15. }  

运行效果示意:


如果原本Text中有文字信息话,它会自动替换,关于DoText后面还可以调用哪些DoTween接口,可以自己下去多试试。


接下来我们使用DoTween做一个游戏的震屏效果

[csharp]  view plain  copy
  1. public class ShakeCamera : MonoBehaviour {  
  2.   
  3.     // Use this for initialization  
  4.     void Start ()  
  5.     {  
  6.         //注意参数自己琢磨一下  
  7.         this.transform.DOShakePosition(0.3f,new Vector3(3,3,3));//0.3=time //振幅=位置   
  8.     }  
  9.       
  10. }  

游戏和透明度动画制作:

[csharp]  view plain  copy
  1. mText.DOColor(Color.blue, 2);//文字颜色  
  2. mText.DOFade(1, 3);//1 显示出来 3秒  


四 学习DoTween面板的可视化操作&动画路线编辑器


小例子:



可视化的面板操作还是比价方便的。当然我们如果还是希望通过代码ちょっと控制一下动画面板的操作的话,同样可以想获取普通组件的方式一样获取动画面板!接着就是DoTween学习最后一个小节了,动画状态路线学习!

新建一个场景,创建一个cube,给这个cube添加DoTweenPath组件,如下图:


添加路径一定要在场景视图中添加,添加完毕之后就可以运行看到效果了:


这一块重要的就是属性的设置了


上图没什么好说的,都是比较基础的设置。



剩下的几个属性可以自己多多去摸索一下就懂了!




本案例工程及插件源码下载地址:

链接:http://pan.baidu.com/s/1boO7UoR 密码:lmua

提供一个查看DoTween动画曲线的网站

http://robertpenner.com/easing/easing_demo.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值