Unity DoTween深度分析

http://dotween.demigiant.com/download.php#download
官网

Unity DoTween深度分析_第1张图片
image.png

点击下载
压缩拖入Unity


image.png

设置Dotween


Unity DoTween深度分析_第2张图片
image.png

在哪里生效
然后代码引入using DG.Tweening;命名空间
下面是常用操作
using UnityEngine;
using System.Collections;
using DG.Tweening;
using UnityEngine.UI;
public class DoTweenText : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        ////移动 参数 结束位置 用时 第三个参数true会把计算的中间数取证
        //transform.DOMove(transform.position + Vector3.up * 3, 2f);
        ////旋转
        //transform.DORotate(transform.position + Vector3.up * 3, 2f);
        ////缓慢看向这个点  观看位置 用时
        //transform.DOLookAt(Vector3.up, 2f);

        //transform.DOScale(transform.position + Vector3.up * 3, 2f);

        //上面的 本地坐标的也有
        //transform.DOLocalMove();
        //transform.DOLocalRotate();

        ////就是类似于球掉地上 多次弹跳差值 越来越低
        ////参数 运动方向和力的大小 持续时间 震动次数、频率  第四个参数越大往返方向运动力就越大
        //transform.DOPunchPosition(new Vector3(0, 1, 0), 2, 10,1);
        //transform.DOPunchRotation();
        //transform.DOPunchScale();

        ////震动 参数 持续时间 振幅(力的强度)次数 震动随机性 最后fadeOut是否淡入淡出
        //transform.DOShakePosition(2,Vector3.one,10,90);
        //transform.DOShakeRotation();
        //transform.DOShakeScale();

        ////混合
        ////当我们用DoMove一个物体同一时间 新的会覆盖掉旧的
        ////他会根据调用的次数进行加减计算 最后移动到-Vector3.one
        //transform.DOBlendableMoveBy(Vector3.one,2);
        //transform.DOBlendableMoveBy(-Vector3.one*2, 2);
        ////Punch方法就旋转一个
        //transform.DOBlendablePunchRotation();

        //改变材质
        // Material mat = GetComponent().material;
        //mat.DOColor(Color.red,2);//相当于改shader shader Color属性名字一定要是_Color不然会报错
        //mat.DOColor(Color.red,"_TinColor",2);//这样可以改变Shader里Color属性这个名字里的Color颜色

        ////控制透明度  调用 Shader里的_Color 的Alpha值
        //mat.DOFade(0,2f);
        //mat.DOFade(0, "_TinColor", 2);//这个指定Shader名也可以

        ////颜色渐变
        //Gradient gra=new Gradient();//就是unity自带的Alpha渐变 public出来可以更直观设置              
        //mat.DOGradientColor(gra,2f);

        ////改变uv值 不是太常用 要实现帧动画不能是渐变的应该是瞬间的
        //mat.DOOffset(Vector3.one,2f);
        ////改变shader属性值
        //mat.DOVector(Color.clear,"_Color",2f);

        ////也可以颜色混合 然后是个紫黑色
        //mat.DOBlendableColor(Color.red,2f);
        //mat.DOBlendableColor(Color.blue, 2f);

        //拖到Camera上
        //Camera camera = GetComponent();
        ////第一个 相机视角  第一个参数=宽/高
        //camera.DOAspect(1f,2);
        ////不过相机的Clear Flags要设置为Solid Color才有效
        //camera.DOColor(Color.green,2f);
        // //改变相机近切面 远切面 就是相机能看到的最近距离和最远距离
        //camera.DONearClipPlane();
        // camera.DOFarClipPlane();

        ////fov 是Camera改变相机透视视角大小 就是狙击枪开倍镜
        //camera.DOFieldOfView(1,5);
        ////相机必须是正交 设置正交大小
        //camera.DOOrthoSize(1,5);
        //改变 相机的像素 Game相机视图会缩放 可以用于差值多个相机分屏 这个Rect根据当前屏幕分辨率设置
        //camera.DOPixelRect(new Rect(0,0,500,500),2);
        //这个是相机上的Viewport Rect的值可以做到跟上面一样的效果
        // camera.DORect(new Rect(0.5f,0.5f,0.5f,0.5f),1); 

        //震动 就是FPS游戏被雷炸了屏幕抖动
        //camera.DOShakePosition(2,10,20);

        ////Text 拖到Text上面
        //Text text = GetComponent();
        ////字逐字出现 如果之前的Text存在会逐字覆盖并出现
        //text.DOText("asdasdasdsaffvxzcv",5);

        ////动画队列 拖到Cube上
        //Sequence seq = DOTween.Sequence();
        ////这样会依次进行
        //seq.Append(transform.DOMove(Vector3.one, 2));//0-2  
        //seq.AppendCallback(() => { Debug.Log("第一个动画完了"); });
        ////添加等待时间
        //seq.AppendInterval(1);//2-3
        //seq.Append(transform.DOMove(-Vector3.one, 2));//3-5
        //seq.Join(transform.DOScale(Vector3.one * 2, 2));
        ////加入到上一个动画一起执行                                                     
        ////插入队列 参数 时间                                                         
        ////seq.Insert(1,transform.DOMove(Vector3.up, 2));
        ////在这一秒强制播放覆盖之前的                                                      
        ////seq.Insert(3, transform.DOScale(Vector3.one*2, 2));//不同的话可以一起执行


        ////预添加 添加到下一个执行 相当于加到了第一个动画后面执行
        //seq.PrependInterval(1);
        //seq.Prepend(transform.DOMove(Vector3.one * 2, 2));
        //seq.PrependCallback(() => { Debug.Log("Prepend完了"); });

        ////插入回调的时间点 下面是个匿名委托
        //seq.InsertCallback(3,()=> { Debug.Log("3S完了"); });

        //seq.AppendCallback(() => { Debug.Log("最后动画完了"); });

        //设置参数 不常用
        //TweenParams para = new TweenParams();
        //para.SetLoops();
        //para.SetAutoKill();
        //transform.DOMove(Vector3.one, 2).SetAs(para);

        //链式 设置参数 次数(-1是无限循环 )type循环类型
        //LoopType.Yoyo是一来一回跑 LoopType.Restart运动到头闪回来
        //LoopType.Incremental增量运动 确定方向就朝一个方向走 
        //SetAutoKill(true)放完会自动删除 不用就缓存下来 在Dotween的一个池子里
        //From() 反向运动 是从结束点到起始点 true增量运动Vector3.one 作为方向及大小 
        //比如起始点是Vector3.one 会一开始位置到Vector3.one*2 然后慢慢运动到Vector3.one 
        // transform.DOMove(Vector3.one, 2).SetLoops(3, LoopType.Incremental).SetAutoKill();
        //transform.DOMove(Vector3.one, 2).From(true);

        //动画延迟3s
        //transform.DOMove(Vector3.one, 2).SetDelay(3);
        //true动画以速度为基准 所以后面的2不算是时间了 算的是速度大小 Vector3.one表示方向
        //transform.DOMove(Vector3.one, 2).SetSpeedBased(true);
        ////设置ID
        //transform.DOMove(Vector3.one, 2).SetId("ID");//最好别用int转 有装箱拆箱性能损耗
        //DOTween.Play("ID");//这样可以在别的地方调用 缓存的动画节省性能
        ////标记是否可回收
        //transform.DOMove(Vector3.one, 2).SetRecyclable(true);

        //增量运动 即使在1,1,1 也会移动到2,2,2 Vector3.one既是方向又是大小
        //transform.DOMove(Vector3.one, 2).SetRelative(true);
        //true忽略Unity timeScale影响 UpdateType是类型 其余三个都是Unity自带的生命周期函数模式
        //transform.DOMove(Vector3.one, 2).SetUpdate(UpdateType.Manual,true);
        // DOTween.ManualUpdate();用这个Update启动

        //各种曲线 Ease主要是一些运动速率曲线
        //http://robertpenner.com/easing/easing_demo.html 
        //这里可以看 点地板球可以看效果
        //后面的 参数  振幅 类似于次数(针对某几种效果) 
        //力的大小 等于0普通 越靠近1最大距离会从一开始会缩小 小于0距离会一点点变大到最大距离
        //官方给出这些参数用于Flash, InFlash, OutFlash, InOutFlash
        transform.DOMove(Vector3.one, 2).SetEase(Ease.Flash,10,-1);

    }

}
Unity DoTween深度分析_第3张图片
cadbb6c85d7cb57b78208668faf31f59_dotween_easeflash.gif
using UnityEngine;
using System.Collections;
using DG.Tweening;
public class DoTweenText2 : MonoBehaviour
{
    public AnimationCurve curve;
    // Use this for initialization
    void Start()
    {
        //设置自定义时间曲线 粒子系统很多
        transform.DOMove(Vector3.one, 2).SetEase(curve);
    }
}

Unity DoTween深度分析_第4张图片
image.png

在绿线可以AddKey去改变扭曲曲线 就可以自定义曲线了

Unity DoTween深度分析_第5张图片
image.png

之前提到的渐变透明度是这个
也都是Unity自带的
上面两个点是透明度 下面两个点是颜色

改完框架版本可以用 要2017之后才支持


Unity DoTween深度分析_第6张图片
image.png

在点击PlayerSetting 然后这一栏里


image.png
Unity DoTween深度分析_第7张图片
image.png
await Task.Delay(TimeSpan.FromSeconds(1));

类似于协程等待一秒执行

这个是一些函数回调 和动画函数

using UnityEngine;
using System.Collections;
using DG.Tweening;
using System;

public class DoTweenText2 : MonoBehaviour
{
    public Gradient gra;
    public AnimationCurve curve;
    // Use this for initialization
    void Start()
    {
        //设置自定义时间曲线 粒子系统很多
        //transform.DOMove(Vector3.one, 2).SetEase(curve);
        //设置自定义曲线 输入方法名让它自动生成
        //transform.DOMove(Vector3.one, 2).SetEase(EaseFun);

        ////回调函数 
        ////动画完成 大写OnComplete可以调用Lamda表达式 onComplete是字段 不可以用
        ////只有动画第一次调用
        //transform.DOMove(Vector3.one, 2).OnPlay(() => { Debug.Log("开始了"); });
        ////多次调用都会有
        //transform.DOMove(Vector3.one, 2).OnStart(() => { { Debug.Log("开始了"); });
        //transform.DOMove(Vector3.one, 2).OnComplete(()=> { Debug.Log("完成了"); });
        ////在暂停
        //transform.DOMove(Vector3.one, 2).OnPause();
        ////每次循环时调用
        //transform.DOMove(Vector3.one, 2).OnStepComplete();
        ////Dotween自带的Update调用
        //transform.DOMove(Vector3.one, 2).OnUpdate();
        ////动画倒播调用
        //transform.DOMove(Vector3.one, 2).OnRewind();

        transform.DOMove(Vector3.one * 2, 2);
        //transform.DOPause();//暂停
        // transform.DOPlay();//开始 这样可以手动控制
        // transform.DORestart();//重新开始
        // transform.DORewind();//倒播
        //transform.DOSmoothRewind();//平滑倒播
        //transform.DOKill();//删除动画
        //await Task.Delay(TimeSpan.FromSeconds(1));
        //transform.DOFlip();//就是把重点设为起始点 翻转了 要测试需要有一个延时让他跑一段
        //调转到时间点 动画第几秒 跳完后是否播放
        //transform.DOGoto(1, true);

        //await Task.Delay(TimeSpan.FromSeconds(1));
        // transform.DOPlayBackwards();//反向播放 要测试需要有一个延时让他跑一段
        //await Task.Delay(TimeSpan.FromSeconds(1));
        //transform.DOPlayForward();//在翻转回一开始的正方向

        //暂停下调用就是播放 播放下就是暂停
        transform.DOTogglePause();
    }

    //0-1 (1,1,1) 1
    //加1就是 1-2 开始(2,2,2) 结束(3,3,3)
    //不过比较麻烦
    private float EaseFun(float time, float duration, float overshootOrAmplitude, float period)
    {
        //当前时间/持续时间=匀速 
        return time / duration + 1;
    }
}

下面是类方法

using UnityEngine;
using System.Collections;
using DG.Tweening;
using System.Collections.Generic;

public class DoTweenText3 : MonoBehaviour
{

    // Use this for initialization
    void Start()
    {
        //List list;
        ////获取当前所有暂停的动画
        //list = DOTween.PausedTweens();
        ////获取当前所有播放的动画
        //list = DOTween.PlayingTweens();

        ////id收集动画  false缓存也算(True是正在播放) 
        //list = DOTween.TweensById("ID", false);
        ////参数 调用动画的对象 他有几个动画 false缓存也算(True是正在播放) 
        //list = DOTween.TweensByTarget(transform, false);
        ////是否有动画 id Target都可以  false缓存也算(True是正在播放)
        //bool b = DOTween.IsTweening(transform);
        ////返回一个正在播放的动画数量
        //int i = DOTween.TotalPlayingTweens();

       
        Tween tween = transform.DOMove(Vector3.one * 2, 2);
        //当前动画执行时间
        float t = tween.fullPosition;

        tween.SetLoops(3);
        //当前循环第几次
        tween.CompletedLoops();
        //循环次数
        tween.Loops();
        //获取当前动画延时时间
        tween.Delay();
        //播放时间  true是返回*循环次数 无限是返回Infinite
        tween.Duration(false);
        //代表当前我已经播放的时间 和上面一样true包含循环
        tween.Elapsed(false);
        //进度的百分比 不计算循环
        tween.ElapsedDirectionalPercentage();
        //动画已用的百分比
        tween.ElapsedPercentage();
        //是否是反向
       bool b= tween.isBackwards;
        //是否完成
        tween.IsComplete();
        //是否初始化完成
        tween.IsInitialized();
        //是否进行
        tween.IsPlaying();
      
    }

}

下面是协程的一些回调 和路径差值动画

using UnityEngine;
using System.Collections;
using DG.Tweening;
using System;
using System.Linq;

public class DoTweenText4 : MonoBehaviour
{

    Tween _tweener;
    public Transform[] PointList;
    // Use this for initialization
    void Start()
    {
        _tweener = transform.DOMove(Vector3.one * 2, 1);
        //StartCoroutine(Wait());

        //付费的有可视化组件 不过都差不多 
        //Lamada表达式吧transform转换Ve3
        var pos = PointList.Select(u => u.position).ToArray();
        //一个Ve3数组 
        //时间 
        //每个点生成是直线还是曲线  Linear直线 CatmullRom弯曲 CubicBezier每个路点有2个控制点的弯曲路径 三维贝赛尔曲线 之前有讲贝赛尔曲线
        //确定正确LOOKAT方向 PathMode.Ignore 无SetLookAt也会失效 Full3D没有限制 TopDown2D只能上下变朝向 Sidescroller2D只能左右变
        //第三个参数的路径其中的精准度 会影响性能 和A星算法一样 是个数组按节点寻找
        //编辑器界面路径的颜色
        transform.DOPath(pos, 3,PathType.CubicBezier,PathMode.Ignore,10,Color.green)
            .SetOptions(true,AxisConstraint.Z,AxisConstraint.X)//true会把路径连在一起构成一个回路 锁定轴 锁定旋转
            .SetLookAt(new Vector3(0,0,0));//看向一个位置和物体 还有个是0-1 0是看路径的前方 垂直于运动方向 1看后面 最好别设置1会出很奇怪的画面0.9就好
        //SetOptions为false时到最后是朝向一开始的方向

    }
    IEnumerator Wait()
    {
        //等待完成
        yield return _tweener.WaitForCompletion();
        //循环执行两次后才执行下面逻辑
        yield return _tweener.WaitForElapsedLoops(2);
        //等待动画被干掉
        yield return _tweener.WaitForKill();
        //等待动画执行几秒后再继续执行
        yield return _tweener.WaitForPosition(1.5f);
        //重新播放调用 好像开始时候也会调用
        yield return _tweener.WaitForRewind();
        //等待执行
        yield return _tweener.WaitForStart();
    }
}

https://github.com/BlueMonk1107/MoveEffectTool
然后这是老师的一个Dotween效果集合
运行后可以看Btn效果 然后右键复制代码 直接可以粘贴到自己的项目上 参数都是调整好的非常方便

还有一种通用写法

using UnityEngine;
using System.Collections;
using DG.Tweening;
public class NewBehaviourScript : MonoBehaviour
{
    // Use this for initialization
    void Start()
    {
        //DoTween函数通用公式
        //get set函数 最终值 时长
        //DOTween.To(()=>value,(x)=>value,10,5);
        //x为你要给的变量赋的值
        DOTween.To(() => transform.position,
            x => transform.position = x,
            new Vector3(10, 0, 0), 5);

        DOTween.To(() => transform.eulerAngles,
            x => transform.eulerAngles = x,
            new Vector3(10, 0, 0), 5);

        //这样写只要能设置就可以改任何值
    }

}

你可能感兴趣的:(Unity DoTween深度分析)