猿创征文| Unity~DOTween相关使用

Posted SYFStrive

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了猿创征文| Unity~DOTween相关使用相关的知识,希望对你有一定的参考价值。

@作者 : SYFStrive

 

@博客首页 : HomePage

📌:个人社区(欢迎大佬们加入) 👉:社区链接🔗

📌:觉得文章不错可以点点关注 👉:专栏连接🔗

💃:程序员每天坚持锻炼💪

🔗:直接阅读文章



👉 Unity插件相关专栏(🔥)

目录


DOTween导入

DOT~Unity自身的扩展方法

DOT~Transform 相关扩展方法

通过DOT~Transform可以让我们在开发中快速、高效,完成关于Transform相关动画。

   1、DOTween的简单应用

实现功能:简单实现移动 && 旋转 && 缩放

实现步骤:导入命名空间(using DG.Tweening;) 👉 使用DOTween

代码及详细说明如 👇

using UnityEngine;
using DG.Tweening;
public class DOTween01 : MonoBehaviour

  private void Start()
  
    移动到原点,移动三秒
    //transform.DOMove(Vector3.one, 3);
    单方向移动
    //transform.
    相对于局部
    //transform.DOLocalMove(Vector3.one, 3);
    //transform.DOLocalMoveX(5,3);

    旋转的度数、旋转三秒
    //transform.Rotate(new Vector3(50, 50, 50), 3);

    //缩放三倍,使用时间三秒
    transform.DOScale(new Vector3(3,3,20),3);
  

移动效果如 👇(旋转缩放类似)


   2、Punch 扩展方法

代码及详细说明如 👇

#region Punch函数
//第一个参数 punch:表示方向及强度
//第二个参数 duration:表示动画持续时间
//第三个参数 vibrato:震动次数
//第四个参数 elascity: 这个值是0到1的
//当为0时,就是在起始点到目标点之间运动
//不为0时,会把你赋的值乘上一个参数,作为你运动方向反方向的点,物体在这个点和目标点之间运动
//移动旋转缩放都是类似的
transform.DOPunchPosition(new Vector3(0, 8, 0), 3f, 100, 0.1f);
transform.DOPunchRotation(new Vector3(0, 90, 0), 3, 1100, 0.1f);
transform.DOPunchScale(new Vector3(2, 2, 2), 2, 100, 0.1f);
#endregion

效果如 👇

   3、Shake 扩展方法

代码及详细说明如 👇

#region Shake
//参数:持续时间,震动强度,震动频次,随机角度,淡出
//    震动:强度
//    震动:震动次数
//    随机性:随机角度
//    淡出:就是运动最后是否缓慢移动回到原本位置
 //移动旋转缩放都是类似的
    //transform.DOShakePosition(2, 0.5f, 60, 90);
    //transform.DOShakeRotation(3);
    //transform.DOShakeScale(3);
#endregion

效果如 👇

   4、Blend 扩展方法

代码及详细说明如 👇

using UnityEngine;
using DG.Tweening;

public class asd : MonoBehaviour

    private void Start()
    
        //DOBlendableMoveBy方法有两个特点
        //  1、允许多个同时执行
        //   如 👇
        transform.DOBlendableMoveBy(new Vector3(5, 5, 5), 1);
        //transform.DOBlendableMoveBy(new Vector3(5, 0, 0), 1);
        //假设其实点为(0,0,0),最后动画停止时的坐标就是(10,5,5)
        //   2、 它是增量动画
        //transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);
        //    假设其实点为(1,1,1),最后动画停止时的坐标就是(2,2,2)
        //   3、移动,选装,缩放类似
        //transform.DOBlendableLocalMoveBy(new Vector3(5, 5, 5), 1);
        //transform.DOBlendableLocalRotateBy(new Vector3(1, 1, 1), 1);    
        //transform.DOBlendableScaleBy(new Vector3(1, 1, 1), 1);  
    

① 允许多个同时执行 如下:

② 它是增量动画

③ 效果如下:

DOT~Material 扩展方法

代码及详细说明如 👇

//1、改变颜色 如👇 (颜色,2秒渐变的时间)
//material.DOColor(Color.red, 2);

//2、按照Szhader的属性名,修改颜色 如👇
//material.DOColor(Color.red, "_Color", 2);

//3、修改alpha值 (也可以通过Szhader的属性名修改)
//方法一 如👇
//material.DOColor(Color.clear, 2);
//方法二 如👇
//material.DOFade(0, 2);

//4、颜色渐变 如👇
//Gradient是Unity的渐变编辑器(通过渐变然后赋值给材质球(也可以通过Szhader的属性名修改))
//material.DOGradientColor(gradient, 3);

//5、改变材质offset的值 如👇
//material.DOOffset(new Vector2(50, 1), 5f);

//6、改变提供的Shader属性的名称对应的Vector4值 如👇
//material.DOVector(new Vector4(0, 0, 0, 0), "_Color", 3);

//7、颜色混合 如👇
//跟位置混合动画同理,可以同时执行而不干扰,产生混合在一起的颜色
//material.DOBlendableColor(Color.red, "_Color", 3);
//material.DOBlendableColor(Color.white, "_Color", 3);
//material.DOBlendableColor(Color.yellow, "_Color", 3);
//material.DOBlendableColor(Color.blue, "_Color", 3);

① 效果如 👇

② 效果如 👇

③ 效果如 👇


④ 效果如 👇

⑤ 效果如 👇

⑥ 效果如 👇

⑦ 效果如 👇

Camera 扩展方法

代码及详细说明如👇

//1、调整屏幕视角的宽高比 第一个参数是宽高的比值
//camera.DOAspect(1f, 2); //以1:1 进行缩放

//2、摄像机的颜色渐变
//camera.DOColor(Color.red, 2);

//3、摄像机的近斜面 与 远斜面
//camera.DONearClipPlane(1000, 2);
//camera.DOFarClipPlane(3000, 5);


//4、摄像机的透视 与 正交 
//camera.DOFieldOfView(0, 2);


//5、按照屏幕百分比计算的显示范围 && 按照屏幕像素计算的显示范围 
//Camera1.DORect(new Rect(0, 0, 0.5f, 0.5f), 2);
//Camera2.DORect(new Rect(0.5f, 0f, 0.5f, 0.5f), 2);
//Camera3.DORect(new Rect(0.5f, 0.5f, 0.5f, 1), 2);
//Camera4.DORect(new Rect(0, 0.5f, 0.5f, 1), 2);

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


//7、相机震动
//相关参数说明 如👇
//持续时间 👉 震动强度 👉 震动次数 👉 随机角度值 👉 是否淡出入
camera.DOShakePosition(1.5f,6,10,30,false);

① 效果如 👇

③ 效果如 👇

④ 效果如(视域大小) 👇

透视如下(视域大小) 👇

正交如下:

⑤ 效果如 👇(多个相机操作)

⑥ 效果如 👇(四倍快乐)

⑦ 效果如 👇

Text 扩展方法

#region Text扩展方法
//获取相关文本
TextAsset textAsset = Resources.Load<TextAsset>("坚持锻炼");

//如之前的方法 (类似)
//text.DOColor(Color.black, 2);
//text.DOFade(0, 2);
//text.DOBlendableColor(Color.black, 2);
//……

//★ 对话的神插件 (需要读取的内容,多少秒读完)
text.DOText(textAsset.ToString(), 20);
#endregion

效果如 👇

DOTween相关扩展方法

   1、Sequence扩展方法

代码及详细说明如 👇

//先进先出
//DOTween~队列相关使用
Sequence quence = DOTween.Sequence();

 1、添加动画到队列中足以执行
//quence.Append(transform.DOMove(Vector3.one, 2));
 2、添加时间间隔1秒然后继续执行以下动画
//quence.AppendInterval(1);
//quence.Append(transform.DOMove(new Vector3(20, 0, 0), 1));
//quence.Append(transform.DOMove(new Vector3(50, 0, 0), 1));

//  3、按时间点插入动画 👉 把第0秒的动画替换掉
//  quence.Insert(0, transform.DOMove(new Vector3(150, 0, 0), 1));

//  4、如下两行代码,DOMove会和DOScale一起执行(执行变大之后便会原来的大小)
//quence.Append(transform.DOScale(Vector3.one*2, 2));
//quence.Join(transform.DOMove(Vector3.zero, 2));

//3 VS 4(效果差不多)

//  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 (后进先出)


//  回调函数

// 1、预添加回调 👉 预加载
quence.PrependCallback(PreCallBack);

// 2、在规定的时间点加入回调 👉 第几秒插入回调
quence.InsertCallback(5, InsertCallBack);

// 3、添加回调 
quence.AppendCallback(CallBack);

效果如 👇

   2、Tweener相关使用

代码及详细说明如 👇

//1、设置动画循环
//玩法1 👇
//transform.DOMove(Vector3.one, 1).SetLoops(15,LoopType.Yoyo);
//   SetLoops第一个参数是循环次数 👉 (- 1)代表无限循环
//   SetLoops第二个参数是循环方式(三种如👇)
//   Restart 重新开始
//   Yoyo 👉 从起点到目标点 👉 回到起点(反复执行)
//   Incremental 👉 向着运动方向运动

//玩法2 👇
//TweenParams tweenParams = new TweenParams();
//tweenParams.SetLoops(-1,LoopType.Yoyo);
//transform.DOMove(Vector3.one, 0.2f).SetAs(tweenParams);

//2、动画完成之后执行销毁
//transform.DOMove(Vector3.one, 1).SetAutoKill(true);

//3、From (反向运动,把起始点当成目标点)
//  如 👉 (向DOMove第一个参数移动)
//  transform.DOMove(Vector3.one, 2).From(true);
//  From参说明如 👇
//     为true,  传入的就是偏移量,即当前坐标 + 传入值 = 目标值
//     为falese,传入的就是目标值,即传入值 = 目标值

//4、设置动画延时
//  transform.DOMove(Vector3.one, 2).SetDelay(1);

//5、设置动画运动速度 添加了SetSpeedBased(基于速度移动)
//  DOMove第二个参数原本表示持续时间的,就变成表示速度的参数,每秒移动的单位数
//  transform.DOMove(Vector3.one, 1).SetSpeedBased(); 

//6、设置动画ID
//  transform.DOMove(Vector3.one, 2).SetId("Id");

//7、可回收对象
//  为true的话,动画播放完会被回收,缓存下来,不然播完就直接销毁
//  transform.DOMove(Vector3.one, 2).SetRecyclable(true);

//8、设置动画为增量运动
//     如 👇
//     transform.DOMove(Vector3.one, 10).SetRelative(true);

//     SetRelative参说明如 👇
//     为true,  传入的就是偏移量,即当前坐标 + 传入值 = 目标值
//     为falese,传入的就是目标值,即传入值 = 目标值


//9、设置动画的帧函数
// 例如:
//   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(时间缩放)

① 玩法1效果如 👇

② 玩法2效果如 👇


……

   3、Ease 运动曲线的设置

代码及详细说明如 👇

//1、如👇 SetEase第一个参数是类型、第二给参数(移动次数(来回算两次))、第三个参数(-1~1之间进行变化)
transform.DOMove(Vector3.one, 2).SetEase(Ease.Flash, 3, 0f);
// 第三个参数 Period 值的范围是 -1~1 
//  值 > 0时,范围会由大变小
//  值 = 0时,起始坐标和目标坐标之间运动
//  值 < 0时,施加向目标坐标的一个力,活动范围一点点增大,最后逼近目标点
//  只对Flash, InFlash, OutFlash, InOutFlash这四种曲线有用,其他的曲线起作用的就只有Ease枚举参数

//2、AnimationCurve(Unity自定义曲线)

//使用如 👇
//transform.DOMove(Vector3.one * 2, 1).SetEase(animationCurve);

AnimationCurve(Unity自定义曲线)如 👇

public AnimationCurve animationCurve; 

   4、DOTween动画执行回调

代码及详细说明如 👇

1、动画完成执行的回调
//transform.DOMove(Vector3.one, 2).OnComplete(() =>
//
    //Debug.Log("动画完成执行的回调");
//);

2、动画释放时执行的回调
//transform.DOMove(Vector3.one, 2).OnKill(() =>
//
    //Debug.Log("动画释放时执行的回调");
//);

3、播放执行时执行的回调
//transform.DOMove(Vector3.one, 3).OnPlay(() =>
//
    //Debug.Log("播放执行时执行的回调");
//);

4、动画暂停时执行的回调
//transform.DOMove(Vector3.one, 2).OnPause(() =>
//
    //Debug.Log("动画暂停时执行的回调");
//);

5、循环周期完成时执行的回调
//transform.DOMove(Vector3.one, 2).OnStepComplete(() =>
//
    //Debug.Log("循环执行动画时执行的回调");
//);

6、只在第一次播放动画时调用,在Play之前调用
//transform.DOMove(Vector3.one, 2).OnStart(() =>
//
    //Debug.Log("只在第一次播放动画时调用,在Play之前调用");
//);

7、播放动画时执行的回调
//transform.DOMove(Vector3.one, 2).OnUpdate(() =>
//
    //Debug.Log("播放动画时执行的回调");
//);

8、动画重新播放时执行
//transform.DOMove(Vector3.one, 2).OnRewind(() =>
//
    //Debug.Log("动画重新播放时执行");
//);

9、动画重新播放时执行
//transform.DOMove(Vector3.one, 2).OnRewind(() =>
//
    //Debug.Log("动画重新播放时执行");
//);

效果如 👇

   5、DOTween 类方法使用

代码及详细说明如 👇

//★类方法
//1、返回所有暂停的动画,没有则返回null
//DOTween.PausedTweens();

//2、返回所有播放的动画,没有则返回null
//OTween.PlayingTweens();

//3、获取给定ID的数组
//  DOTween.TweensById("id", true);
//  返回满足条件的动画数组
//  参数1:是动画的ID
//  参数2:true 👉 正在播放的动画

//4、返回给定对象的数组
//  DOTween.TweensByTarget(transform, true);
//  返回满足条件的动画数组
//  参数1:是播放动画的对象
//  参数2:true 👉 正在播放的动画

//5、判断动画是否在播放
// DOTween.IsTweening(transform);
//  参数1: 为true时,给定对象在播放状态时 返回true
//  参数2: 为false时,是否有动画内容

//6、统计正在播放的动画,延迟也算
//  DOTween.TotalPlayingTweens();

效果如 👇

   6、DOTween 动画进度状态的判断

代码及详细说明如 👇

var 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(false);

6、返回动画进度的百分比
当yoyo循环模式下,会来回执行(计算整体时间的百分比)
//tweener.ElapsedDirectionalPercentage();

7、返回动画区间已用的百分比
单次循环的数值为0到1
//tweener.ElapsedPercentage(true);

8、动画是否是播放状态
//bool play  =tweener.IsActive();
//if (play)
//    Debug.Log("动画处于播放状态");

9、是否处于反向
//tweener.IsBackwards();

10、动画是否完成
//tweener.IsComplete();

11、是否以初始化
//tweener.IsInitialized();

12、是否正在播放
//tweener.IsPlaying();

13、返回循环次数
//tweener.Loops();

效果如 👇

   7、DOTween携程

代码及详细说明如 👇

Tween tween;
private void Awake()

     tween = transform.DOMove(Vector3.one, 2).SetLoops(3);
    //开启携程
    StartCoroutine(waitFunc());


private IEnumerator waitFunc()

    //1、等待动画执行完
    yield return tween.WaitForCompletion();
    Debug.Log("等待动画执行完");
    //2、等待指定的循环次数(如循环3此,这里指定2次那么执行两次后这里执行)
    yield return tween.WaitForElapsedLoops(2);//注意超过次数会继续执行
    Debug.Log("等待指定的循环次数");
    //3、动画执行完毕执行
    yield return tween.WaitForKill();
    Debug.Log("动画执行完毕执行");
    //4、等待动画执行指定时间(时间位置)
    yield return tween.WaitForPosition(1.5f);
    Debug.Log("动画已过了1.5秒");
    yield return tween.WaitForRewind();
    Debug.Log("重新执行函数");
    yield return tween.WaitForStart();
    Debug.Log("等待Start执行后继续执行");

效果如 👇

   8、DOTween路径动画

代码及详细说明如 👇

using System.Linq;

public Transform[] listTransform;

private void Awake()

    //拿到listTransform里面的所有Position 👉 转成一个数组
    var listPos =listTransform.Select(positionPos => positionPos.position).ToArray();
    //使用DOpath路劲
    //动画路径参数说明如👇:
    //参数1 👉 是提供路径上点的坐标,需要按顺序添加进数组
    //参数2 👉 路径动画的整体持续时间
    //参数3 👉 线的类型 : 直线(Linear)、曲线(CatmullRom)……
    //参数4 👉 路径模式(四种类型) :如👇
    //Ignore:3d场景下 👉 忽略参数和设置的LookAt参数
    //Full3D:3d场景下 👉 看向任何方向
    //TopDown2D:3d场景下 👉 只能上下旋转,看向物体
    //Sidescroller2D:3d场景下 👉 只能左右旋转看向物体
    //参数5 👉 路径分辨率,代表路径点之间的曲线由多少个点构成,也就是点越多,曲线就越圆
    //参数6 👉 设置路径的颜色和
    transform.DOPath(listPos,10, PathType.CatmullRom,PathMode.Full3D,10,Color.red);

效果如 👇

最后


本文到这里就结束了,大佬们的支持是我持续更新的最大动力,希望这篇文章能帮到大家💪

 

                 相关专栏连接🔗

下篇文章再见ヾ( ̄▽ ̄)ByeBye

以上是关于猿创征文| Unity~DOTween相关使用的主要内容,如果未能解决你的问题,请参考以下文章

猿创征文| Unity使用新输入系统InputSystem制作飞机大战Demo

猿创征文| Unity简单实现跑马灯抽奖

猿创征文|Unity开发实战—— 2D项目1 - Ruby‘s Adventure 游戏地图绘制(2-1)

猿创征文|OpenCV编程——计算机视觉的登堂入室

猿创征文 | 云原生领域之容器日常使用工具推荐

猿创征文|Promethues入门,看懂不会写