千锋教育-做有情怀、有良心、有品质的职业教育机构

手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

当前位置:首页  >  技术干货  > Unity中DOTween的用法解析

Unity中DOTween的用法解析

来源:千锋教育
发布人:syq
时间: 2022-06-08 11:58:00 1654660680

  /*

  * DOTween真的比iTween好很多:

  * 1.编写方面更加人性化

  * 2.效率高很多

DOTween的用法

  * DoTween插件的基本概念以及简介:

  * 1.DoTween实现的是通用的缓动算法,用于给Unity中的游戏对象添加动作动画。

  * 2.DoTween的API风格一律采用链式调用,再配以Lambda匿名函数的调用,可以配置出各种各样想要的丰富的动画效果。

  * 3.DoTween还可以实现队列延迟回调函数,也能完成各种异步延迟执行的功能。

  * 4.DoTween为了方便开发者使用,对各种Unity的脚本对象进行了函数绑定,例如:

  * Transform, Color, Text, Material等都可以直接调用DoTween的动画函数

  *

  * 绑定的快捷方式动画函数API

  * 函数名称解释:

  * 都是以DO开头,带Local的就是局部坐标系,不带的指的是基于世界坐标系

  * 所有函数调用都是链式调用

  * 可以自己设置缓动算法的类型,也可以用一些已经配置好的缓动算法,比如跳跃Jump

  * 这类函数的API调用更符合常用函数的使用习惯,move就是移动,scale就是缩放,rotation就是旋转,color就是颜色,数值的变化就是float

  * 更多的功能用法直接在程序中自动补全就可以理解意思了

  *

  * 1.以DO开头的方法:就是补间动画的方法。例如:transform.DOMoveX(100,1)

  * 2.以Set开头的方法:设置补间动画的一些属性。例如:myTween.SetLoops(4, LoopType.Yoyo)

  * 3.以On开头的方法:补间动画的回调方法。例如:myTween.OnStart(myStartFunction)

  好了,正式开始!首先去Unity应用商城下载DOTween,导入工程。

  */

  using System.Collections;

  using UnityEngine;

  using DG.Tweening;

  using UnityEngine.UI;

  public class CubeAnimator : MonoBehaviour

  {

    Camera _camera;

    Material material;

    public Text text;

    Tweener _tweener;

    void Start()

    {

  /*DOTween初始化与全局设置:

  当你第一次创建一个Tween时,DOTween就会自动初始化(只初始化一次)。

  当然,也可以使用DOTween.Init方法进行自定义,但要在第一次创建一个Tween前。所有创建的Tween都会受DOTween.Init方法的影响。

  *recycleAllByDefault :如果为true,则当Tween完成时就会被回收,放到一个池中;否则就会被destroy

  *useSafeMode :效率会稍微降低,但更安全

  *logBehaviour :默认值为只打印错误信息

  */

  DOTween.Init(false, true, LogBehaviour.ErrorsOnly);

  _camera = Camera.main;

  material = GetComponent().material;

  //一、Unity常用组件拓展方法

  //(1) Transform拓展方法

  TestTransformFuncAnim();

  //(2) _camera拓展方法

  TestCameraFuncAnim();

  //(3) Material拓展方法

  TestMaterialFuncAnim();

  //(4) Text拓展方法

  TestTextFuncAnim();

  //二、Dotween常用方法

  //Sequence动画序列函数API

  /*

  * 基本解释说明:

  * 动画序列其实就是包含了一组Tweener并且操作其他Tweener的一个工具

  * 动画序列并不一定要一个接着一个的播放和执行

  * 动画序列之间可以重叠和重复

  * 你可以以任何你所期望的形式混合夹杂着去使用它们

  * DOTween.Sequence()会创建一个动画序列对象,以后所有的Sequence函数都会返回这个Sequence对象,也就是说动画序列也可以链式调用

  * Append(tweener) 可以在队尾追加一个tweener,会按照顺序依次执行这个tweener序列,一个tweener完成后执行下一个。

  * Insert(time, tweener) 可以在队列中插入一个tweener,第1个参数代表插入的时间点,第2个参数代表在此时间点插入的动画。

  * AppendInterval(time) 可以在队尾追加一个时间间隔功能函数,在队列执行的过程中,停顿一个时间,然后继续执行。

  * AppendCallback(func) 可以在队尾追加一个匿名函数,在队列中执行一个回调。

  */

  //(5) Sequence 队列

  TestSequenceAnim();

  //(6) Tweener的设置

  SetterTweener();

  //7.关于Ease缓动函数的说明

  /*

  * 基本概念说明:

  * 缓动函数是指动画效果在执行时的速度,使其看起来更加真实。

  * Ease.InSine 表示正弦加速动作

  * Ease.OutSine 表示正弦减速动作

  * Ease.InOutSine 表示正弦加速减速动作

  * 每个效果都分3种缓动方式:

  * (1).easeIn:从0开始加速的缓动

  * (2).easeOut:减速到0的缓动

  * (3).easeInOut:前半段从0开始加速,后半段减速到0的缓动

  * 其中Linear是线性缓动,也叫无缓动效果,没有上述说明中的效果。

  */

  //(7) 运动曲线的设置

  TestEaseFuncAnima();

  //(8) 动画回调事件

  TestCallBack();

  //(9) 动画控制方法

  TestAnimatorController();

  //(10) 获取数据方法

  GetTweenerDat();

  //(11) 协程方法

  StartCoroutine(Wait());

  }

  //(1) Transform拓展方法

  private void TestTransformFuncAnim()

  {

  //Position

  //1)改变世界坐标

  //移动方法,第一个参数是要移动到的目标点,不是移动这个向量的距离

  transform.DOMove(new Vector3(1, 1, 1), 2);

  //只控制x轴上的移动,其他两个方向同理

  transform.DOMoveX(1, 2);

  //2)改变局部坐标

  transform.DOLocalMove(new Vector3(1, 1, 1), 2);

  transform.DOLocalMoveX(1, 2);

  //Rotation

  //1)世界旋转

  //旋转到给定的值,改变的是欧拉角

  transform.DORotate(new Vector3(0, 90, 0), 2);

  //旋转到给定的值,改变的是四元数

  transform.DORotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);

  //2)局部旋转

  // 旋转到给定的值,改变的是欧拉角

  transform.DOLocalRotate(new Vector3(0, 90, 0), 2);

  // 旋转到给定的值,改变的是四元数

  transform.DOLocalRotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);

  // 在给定时间内,平滑的让自身的z轴正方向指向目标点

  transform.DOLookAt(new Vector3(0, 0, 0), 2);

  // Scale

  //同上面一样,这里改变物体的缩放到目标值

  transform.DOScale(new Vector3(2, 2, 2), 2);

  //其他两个轴向同理

  transform.DOScaleX(3, 2);

  //Punch

  /*

  第一个参数 punch:表示方向及强度

  第二个参数 duration:表示动画持续时间

  第三个参数 vibrato:震动次数

  第四个参数 elascity: 这个值是0到1的

  当为0时,就是在起始点到目标点之间运动

  不为0时,会把你赋的值乘上一个参数,作为你运动方向反方向的点,物体在这个点和目标点之间运动

  */

  transform.DOPunchPosition(new Vector3(0, 1, 0), 2, 2, 0.1f);

  transform.DOPunchRotation(new Vector3(0, 90, 0), 2, 2, 0.1f);

  transform.DOPunchScale(new Vector3(2, 2, 2), 2, 2, 0.1f);

  //Shake

  /*

  * 参数:持续时间,力量,震动,随机性,淡出

  力量:实际就是震动的幅度,可以理解成相机施加的力的大小 使用Vector3可以选择每个轴向不同的强度

  震动:震动次数

  随机性:改变震动方向的随机值(大小:0~180)

  淡出:就是运动最后是否缓慢移动回到原本位置

  */

  transform.DOShakePosition(1, 5, 10, 50, true);

  transform.DOShakeRotation(3);

  transform.DOShakeScale(3);

  //带Blend名称的方法,允许混合动画

  //原本同时执行两个Move方法,只会执行最新的一个动画命令

  //例如:

  transform.DOMove(Vector3.one, 2);

  transform.DOMove(Vector3.one * 2, 2);

  //结果是物体运动到了(2,2,2)坐标上

  //DOBlendableMoveBy方法有两个特点

  //1)允许多个同时执行

  //例如:

  transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);

  transform.DOBlendableMoveBy(new Vector3(-1, 0, 0), 1);

  //假设起始为(0,0,0),最后动画停止时的坐标就是(0,1,1)

  //2)它是增量动画

  transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);

  //假设其实点为(1,1,1),最后动画停止时的坐标就是(2,2,2)

  //它的参数不是目标点,而是要移动的量

  /*以下三个函数同理

  transform.DOBlendableRotateBy

  transform.DOBlendableScaleBy()

  transform.DOBlendablePunchRotation()

  */

 }

  //(2) Camera拓展方法

  private void TestCameraFuncAnim()

  {

  //1)调整屏幕视角的宽高比 第一个参数是宽高的比值

  _camera.DOAspect(0.6f, 2);

  //2)改变相机background参数的颜色

  _camera.DOColor(Color.blue, 2);

  //3)改变相机近切面的值

  _camera.DONearClipPlane(200, 2);

  //4)改变相机远切面的值

  _camera.DOFarClipPlane(2000, 2);

  //5)改变相机FOV的值

  _camera.DOFieldOfView(30, 2);

  //6)改变相机正交大小

  _camera.DOOrthoSize(10, 2);

  //7)按照屏幕像素计算的显示范围

  _camera.DOPixelRect(new Rect(0f, 0f, 600f, 500f), 2);

  //8)按照屏幕百分比计算的显示范围

  _camera.DORect(new Rect(0.5f, 0.5f, 0.5f, 0.5f), 2);

  /*

  9)相机震动

  相机震动效果 参数:持续时间,力量,震动,随机性,淡出

  力量:实际就是震动的幅度,可以理解成相机施加的力的大小 使用Vector3可以选择每个轴向不同的强度

  震动:震动次数

  随机性:改变震动方向的随机值(大小:0~180)

  淡出:就是运动最后是否缓慢移动回到原本位置

  */

  _camera.DOShakePosition(1, 10, 10, 50, false);

 }

  //(3) Material拓展方法

  private void TestMaterialFuncAnim()

  {

  // 1)改变颜色

  material.DOColor(Color.black, 2);

  // 2)按照shader的属性名,修改颜色

  material.DOColor(Color.clear, "_Color", 2);

  // 3)修改alpha值

  material.DOFade(0, 2);

  // 4)颜色渐变

  // Gradient是unity的渐变编辑器(下面有渐变编辑器的图)

  // material.DOGradientColor(Gradient, "_Color", 3);

  // 5)改变材质offset的值

  material.DOOffset(new Vector2(1, 1), 2);

  // 6)改变提供的shader属性的名称对应的Vector4值

  material.DOVector(new Vector4(0, 0, 0, 1), "_Color", 3);

  // 7)颜色混合

  // 跟位置混合动画同理,可以同时执行而不干扰,产生混合在一起的颜色

  material.DOBlendableColor(Color.red, "_Color", 3);

 }

  //(4) Text拓展方法

  private void TestTextFuncAnim()

  {

  //头三个都是常规方法,不多介绍了

  text.DOColor(Color.black, 2);

  text.DOFade(0, 2);

  text.DOBlendableColor(Color.black, 2);

  //打字机效果

  //是把第一个参数传入的内容按照时间,一个字一个字的输入到文本框中

  text.DOText("context", 2);

  }

  //(5) Sequence 队列

  private void TestSequenceAnim()

  {

  Sequence quence = DOTween.Sequence();

  //1)添加动画到队列中

  quence.Append(transform.DOMove(Vector3.one, 2));

  //2)添加时间间隔

  quence.AppendInterval(1);

  //3)按时间点插入动画

  //第一个参数为时间,此方法把动画插入到规定的时间点

  // 以这句话为例,它把DORotate动画添加到此队列的0秒时执行,虽然它不是最先添加进队列的

  quence.Insert(0, transform.DORotate(new Vector3(0, 90, 0), 1));

  //4)加入当前动画

  // Join会加入和让动画与当前正在执行的动画一起执行

  //如下两行代码,DOMove会和DOScale一起执行

  quence.Append(transform.DOScale(new Vector3(2, 2, 2), 2));

  quence.Join(transform.DOMove(Vector3.zero, 2));

  //5)预添加动画

  // 预添加 会直接添加动画到Append的前面,也就是最开始的时候

  //quence.Prepend(transform.DOScale(Vector3.one * 0.5f, 1));

  //这里需要特别说一下预添加的执行顺序问题

  //它这里也采取了队列的性质,不过,预添加与原本的的队列相比是一个反向队列

  //例如:

  // Sequence quence = DOTween.Sequence();

  //quence.Append(transform.DOMove(Vector3.one, 2));

  //quence.Prepend(transform.DOMove(-Vector3.one * 2, 2));

  //quence.PrependInterval(1);

  //执行顺序是 PrependInterval----Prepend---- - Append

  //就是最后添加的会在队列的最顶端

  //6)预添加时间间隔

  quence.PrependInterval(1);

  // 回调函数

  // 1)预添加回调

  quence.PrependCallback(

  () => { Destroy(gameObject); }

 );

  // 2)在规定的时间点加入回调

  quence.InsertCallback(1,

  () => { Destroy(gameObject); }

 );

  //3)添加回调

  quence.AppendCallback(

  ()=>{ Destroy(gameObject); }

 );

}

  //(6) Tweener的设置

  private void SetterTweener()

  {

  TweenParams para = new TweenParams();

  // 1)设置动画循环

  // 第一个参数是循环次数 - 1代表无限循环

  // 第二个参数是循环方式

  // Restart 重新开始

  // Yoyo 从起始点运动到目标点,再从目标点运动回来,这样循环

  //Incremental 一直向着运动方向运动

  para.SetLoops(-1, LoopType.Yoyo);

  //2)设置参数

  transform.DOMove(Vector3.one, 2).SetAs(para);

  //3)设置自动杀死动画

  transform.DOMove(Vector3.one, 1).SetAutoKill(true);

  //4)from补间

  // 例如;

  transform.DOMove(Vector3.one, 2).From(true);

  //From参数 isRelative(相对的):

  //为true,传入的就是偏移量,即当前坐标 + 传入值 = 目标值

  //为falese,传入的就是目标值,即传入值 = 目标值

  //5)设置动画延时

  transform.DOMove(Vector3.one, 2).SetDelay(1);

  //6)设置动画运动以速度为基准 例如:

  transform.DOMove(Vector3.one, 1).SetSpeedBased();

  //使用SetSpeedBased时,移动方式就变成以速度为基准

  //原本表示持续时间的第二个参数,就变成表示速度的参数,每秒移动的单位数

  //7)设置动画ID

  transform.DOMove(Vector3.one, 2).SetId("Id");

  //8)设置是否可回收

  // 为true的话,动画播放完会被回收,缓存下来,不然播完就直接销毁

  transform.DOMove(Vector3.one, 2).SetRecyclable(true);

  //9)设置动画为增量运动

  //例如:

  transform.DOMove(Vector3.one, 2).SetRelative(true);

  //SetRelative参数 isRelative(相对的):

  //为true,传入的就是偏移量,即当前坐标 + 传入值 = 目标值

  //为falese,传入的就是目标值,即传入值 = 目标值

  //10)设置动画的帧函数

  //例如:

  transform.DOMove(Vector3.one, 2).SetUpdate(UpdateType.Normal, true);

  //第一个参数 UpdateType :选择使用的帧函数

  //UpdateType.Normal:更新每一帧中更新要求。

  //UpdateType.Late:在LateUpdate调用期间更新每一帧。

  //UpdateType.Fixed:使用FixedUpdate调用进行更新。

  //UpdateType.Manual:通过手动DOTween.ManualUpdate调用进行更新。

  //第二个参数:为TRUE,则补间将忽略Unity的Time.timeScale

  }

  //(7) 运动曲线的设置

  private void TestEaseFuncAnima()

  {

  //关于Ease缓动函数的说明

  /*

  * 基本概念说明:

  * 缓动函数是指动画效果在执行时的速度,使其看起来更加真实。

  * Ease.InSine 表示正弦加速动作

  * Ease.OutSine 表示正弦减速动作

  * Ease.InOutSine 表示正弦加速减速动作

  * 每个效果都分3种缓动方式:

  * (1).easeIn:从0开始加速的缓动

  * (2).easeOut:减速到0的缓动

  * (3).easeInOut:前半段从0开始加速,后半段减速到0的缓动

  * 其中Linear是线性缓动,也叫无缓动效果,没有上述说明中的效果。

  */

  //线性缓动,匀速运动

  //transform.DOMove(new Vector3(0, 5, 0), 2).SetRelative().SetLoops(-1, LoopType.Yoyo).SetEase(Ease.Linear);

  //先快后慢正弦运动

  transform.DOMove(new Vector3(0, 5, 0), 2).SetRelative().SetLoops(-1, LoopType.Yoyo).SetEase(Ease.InOutSine);

  }

  //(8) 动画回调事件

  private void TestCallBack()

  {

  //1)动画完成回调

  transform.DOMove(Vector3.one, 2).OnComplete(() => { });

  //2)动画被杀死时回调

  transform.DOMove(Vector3.one, 2).OnKill(() => { });

  //3)动画播放时回调,暂停后重新播放也会调用

  transform.DOMove(Vector3.one, 3).OnPlay(() => { });

  //4)动画暂停时回调

  transform.DOMove(Vector3.one, 2).OnPause(() => { });

  //5)动画回退时回调

  // 以下情况会被调用

  //使用DORestart重新播放时

  //使用Rewind倒播动画完成时

  //使用DOFlip翻转动画完成时

  //使用DOPlayBackwards反向播放动画完成时

  transform.DOMove(Vector3.one, 2).OnRewind(() => { });

  //6)只在第一次播放动画时调用,在play之前调用

  transform.DOMove(Vector3.one, 2).OnStart(() => { });

  //7)完成单个循环周期时触发

  transform.DOMove(Vector3.one, 2).OnStepComplete(() => { });

  //8)帧回调

  transform.DOMove(Vector3.one, 2).OnUpdate(() => { });

  //9)在路径动画时,改变目标点时的回调,参数为当前目标点的下标

  transform.DOMove(Vector3.one, 2).OnWaypointChange((value) => { });

  }

  //(9) 动画控制方法

  private void TestAnimatorController()

  {

  //1)播放

  transform.DOPlay();

  //2)暂停

  transform.DOPause();

  // 3)重播

  transform.DORestart();

  // 4)倒播,此方法会直接退回起始点

  transform.DORewind();

  // 5)平滑倒播,此方法会按照之前的运动方式从当前位置退回起始点

  transform.DOSmoothRewind();

  // 6)杀死动画

  transform.DOKill();

  // 7)翻转补间的方向

  transform.DOFlip();

  // 8)跳转时间点

  // 第一个参数跳转的时间点,第二个参数是跳转后是否播放动画

  transform.DOGoto(1.5f, true);

  // 9)反向播放动画

  // 反向播放动画,在动画播放到一半时执行,会退回起始点,在一开始执行看不到效果是因为,物体本身就在起始点

  transform.DOPlayBackwards();

  // 10)正向播放动画

  // 正向播放动画

  transform.DOPlayForward();

  // 11)TogglePause

  // 当暂停时,执行就继续播放,播放时,执行就暂停

  transform.DOTogglePause();

 }

  private void GetTweenerDat()

  {

  // 一、类方法

  //1)返回所有暂停的动画,没有则返回null

  DOTween.PausedTweens();

  //2)返回所有真正播放的动画,没有则返回null

  DOTween.PlayingTweens();

  //3)获取给定ID的数组

  //例如:

  DOTween.TweensById("id", true);

  //返回满足条件的动画数组

  //第一个参数是动画的ID

  //第二个参数是是否只收集正在播放的动画

  //4)返回给定对象的数组

  //例如:

  DOTween.TweensByTarget(transform, true);

  //返回满足条件的动画数组

  //第一个参数是播放动画的对象

  //例如:transform.DOMove(Vector3.one, 2); 第一个参数就传入transform

  // material.DOColor(Color.White, 2); 第一个参数就传入材质对象material

  //第二个参数是是否只收集正在播放的动画

  //5)收集传入的对象是否有动画在活动

  //例如:

  DOTween.IsTweening(transform);

  //第一个参数为检测的对象

  //第二个参数为是否检测动画在播放状态

  //为true时,给定对象在播放状态时 返回true

  //为false时,只检测给定对象是否有动画(在pause状态时也算)有则返回true

  // 6)正在播放的动画的总数,目前处于延迟播放状态的动画也算

  DOTween.TotalPlayingTweens();

  // 二、实例方法

  _tweener = transform.DOMove(Vector3.one, 2);

  //1)表示动画执行时间的属性,可读可写

  _tweener.fullPosition = 1;

  // 2)表示动画执行完的次数

  _tweener.CompletedLoops();

  // 3)获取动画的延迟时间

  _tweener.Delay();

  // 4)获取动画的持续时间

  // 参数为true 表示计算循环的时间,无限循环为Infinity

  _tweener.Duration(false);

  //5)动画已播放的时间

  // 参数为true 表示计算循环的时间

  _tweener.Elapsed();

  //6)返回动画进度的百分比

  // 起始点为0 目标点为1 当yoyo循环模式下,值会从0变到1再从1变到0

  _tweener.ElapsedDirectionalPercentage();

  //7)返回动画区间已用的百分比

  //单次循环的数值为0到1

  //参数为 是否包含循环 为true时 返回值是循环总区间的已用百分比 若为无限循环 返回值为0

  _tweener.ElapsedPercentage(true);

  //8)动画是否在活动

  _tweener.IsActive();

  // 9)是否是反向动画

  _tweener.IsBackwards();

  //10)动画是否完成

  _tweener.IsComplete();

  //11)是否以初始化

  _tweener.IsInitialized();

  //12)是否正在播放

  _tweener.IsPlaying();

  //13)返回循环次数, 无限循环为Infinity

  _tweener.Loops();

  }

  //协程方法

  private IEnumerator Wait()

  {

  _tweener = transform.DOMove(Vector3.one, 2);

  // 1)等待动画执行完

  yield return _tweener.WaitForCompletion();

  //2)等待指定的循环次数

  //参数为执行次数,等待传入的循环次数后,继续执行

  //若是传入的次数大于动画的循环次数 则在动画结束时继续执行

  yield return _tweener.WaitForElapsedLoops(2);

  //3)等待动画被杀死

  yield return _tweener.WaitForKill();

  //4)等待动画执行指定时间

  //参数为时间,动画执行传入的时间之后或动画执行完毕,继续执行

  yield return _tweener.WaitForPosition(0.5f);

  //5)等待动画回退

  // 以下情况会继续执行函数

  //使用DORestart重新播放时

  //使用Rewind倒播动画完成时

  //使用DOFlip翻转动画完成时

  //使用DOPlayBackwards反向播放动画完成时

  yield return _tweener.WaitForRewind();

  // 6)等待Start执行后继续执行

  yield return _tweener.WaitForStart();

  }

 }

 更多关于ITUnity培训的问题,欢迎咨询千锋教育在线名师。千锋教育拥有多年IT培训服务经验,采用全程面授高品质、高体验培养模式,拥有国内一体化教学管理及学员服务,助力更多学员实现高薪梦想。

tags:
声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。
10年以上业内强师集结,手把手带你蜕变精英
请您保持通讯畅通,专属学习老师24小时内将与您1V1沟通
免费领取
今日已有369人领取成功
刘同学 138****2860 刚刚成功领取
王同学 131****2015 刚刚成功领取
张同学 133****4652 刚刚成功领取
李同学 135****8607 刚刚成功领取
杨同学 132****5667 刚刚成功领取
岳同学 134****6652 刚刚成功领取
梁同学 157****2950 刚刚成功领取
刘同学 189****1015 刚刚成功领取
张同学 155****4678 刚刚成功领取
邹同学 139****2907 刚刚成功领取
董同学 138****2867 刚刚成功领取
周同学 136****3602 刚刚成功领取
相关推荐HOT