Calmer的文章

  • 首页
  • 文章归档
  • 关于页面

  • 搜索
体验游戏 笔记 推荐 工具链 工具使用 小游戏 插件 UI 软件 教程

DoTween的使用

发表于 2020-04-01 | 分类于 游戏开发 | 0 | 阅读次数 1174

前言

  • 为什么要使用DoTween?
    使用DoTween插件大大减少了我们制作简单动画的代码量;同时也不用给游戏物件去弄个Animation或者Animator,提升了工作效率和性能;DoTween还不光可以用于UI动画,也能用于3D相关的动画。

下载安装

  • 下载
    DoTween分 免费版 和 Pro版 两个版本
    DoTween官网:http://dotween.demigiant.com/index.php
    免费版下载:http://dotween.demigiant.com/download.php
    Pro版下载:http://dotween.demigiant.com/pro.php
    DoTween官方文档:http://dotween.demigiant.com/documentation.php
    Pro版本DOTween Animation和DOTween Path这两个组件,支持可视化编辑,提供了一个可视化编辑器管理

  • 安装

    1.首先在官网上下载DoTween的最新版
    注意:从官网下载的是zip的压缩包,解压之后需要将文件夹手动拖拽到工程中去
    2.成功导入之后Unity的工程中在Unity编辑器中会出现Tools一项
    出现之后点击Tools->DOTween Utility Panel
    3.之后会弹出DoTween的面板,点击SetUp DoTween完成自动设置

    如果你要在代码中使用DoTween,那么在代码中,使用DoTween的时候我们需要引入using DG.Tweening;


使用

对与动画,就几个非常常用的。

值:int、float等

using UnityEngine;
using DG.Tweening;
public class DoTweenValueTest:MonoBehaviour
{
    private float myValue=0.0f;
    private void Start()
    {
        
        // 参数1:需要改变的值
        // 参数2:x是myValue变成"endValue"的过程不断返回的值
        // 参数3:endValue 目标值
        // 参数4:myValue变成endValue需要的时间
        // 将myValue变成"endValue"所对应的值
        // DOTween.To (() => myValue, x => myValue = x, 5, 5);

        //以下三种写法效果一样
        //-----------
        //1.最简单写法
        DOTween.To(()=>myValue,x=>transform.position=new Vector3(x,0,0),5,5);
        //2.完整lamda表达式
        DOTween.To(()=>{return myValue;},(x)=>{transform.position=new Vector3(x,0,0);},5,5);
        //3.完整函数委托
        DG.Tweening.Core.DOGetter<float> getter=GetMyValue;
        DG.Tweening.Core.DOSetter<float> setter=SetMyValue;
        DOTween.To(getter,setter,5,5);
    }

    private float GetMyValue()
    {
        return myValue;
    }

    private void SetMyValue(float x)
    {
        myValue=x;
        transform.position=new Vector3(myValue,0,0);
    }
}

位置

using UnityEngine;
using DG.Tweening;

public class DoTweenPostionTest:MonoBehaviour
{
    private Vector3 tarPos=Vector3.one*3;

    private void Start()
    {
        //第一个参数:目标位置
        //第二个参数:到达目标位置所需时间
        transform.DOMove(tarPos,3,false);
        //只移动某一个轴
        //transform.DoMoveX(3,3);
        //transform.DoMoveY(4,3);
        //transform.DoMoveZ(5,3);
    }

    /*
    以下方法与上面DOMove默认的线性插值所产生的效果类似
    private void Update()
    {
        if(Vector3.Distance(transform.position,tarPos)>=0.01f)
        {
            transform.position=Vector3.Lerp(transform.position,tarPos,Time.deltaTime);
        }
        else
        {
            transform.position=tarPos;
        }
    } 
    */   
}

旋转

//欧拉角
transform.DORotate(new Vector3(0,180,0),3);
//四元数
//transform.DORotateQuaternion();

缩放

transform.DOScale(1.1f,3);  //整体缩放到1.1
transform.DOScaleX(1.2,3);  //X轴缩放到1.2
transform.DOScaleY(1.3,3);  
transform.DOScaleZ(1.4,3);

颜色

//渐变包含Alpha值的Color
GetComponent<Image>().DOColor(new Color(1,1,1,1),3);
//不包含Alpha值
GetComponent<Image>().DOColor(new Color(1,1,1),3);
//只进行Alpha值的变化
GetComponent<Image>().DoFade(0,3);

锚点

//UI中的RectTransform的锚点变换
GetComponent<RectTransform>().DOAnchorPos(new Vector2(1,1),3,false);

对Tweener的控制

我们执行的DOMove、DORotate、DOScale等都会返回一个Tweener对象。我们可以对其进行设置一些参数,并进行动画的控制

using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
//此脚本可以挂在一个Button上进行测试
public class DoTweenTest:MonoBehaviour
{
    //Image的Transform,可以在Unity上进行拖拽赋值
    public Transform tf;
    private Tweener tweener;
    private bool isOri=true;

    private void Start()
    {
        //获取当前脚本挂在的Button组件并添加Listener
        GetComponent<Button>().onClick.AddListener(MoveImage);
        //对Image的Transform进行操作
        tweener=tf.DoMoveX(5,2.0f);
        //暂停tweener
        tweener.Pause();
        //设置动画类型,默认的是Linear,Ease是枚举型
        tweener.SetEase(Ease.Linear);
        //设置播放完不自动释放
        Tweener.SetAutoKill(false);
        //设置播放完回调函数,动画倒放不会触发
        tweener.onComplete=Complete;
    }

    private void MoveImage()
    {
        if(isOri)
        {
            //动画正向播放
            tweener.PlayForward();
        }
        else
        {
            //动画倒放,不会触发Complete回调函数
            tweener.PlayBackwards();
        }
        isOri=!isOri;
    }

    private void Complete()
    {
        Debug.Log("播放完了");
    }
}

扩展
tween.SetLoops(-1);//设置循环次数,-1为无限循环
tween.SetUpdate(true); //设置后不受TimeScale影响


封装

针对以上的常用动画功能,进行了简单的封装。DoTweenUtils.cs

using UnityEngine;
using DG.Tweening;
using System;
using UnityEngine.UI;

public static class DoTweenUtils
{
    public static void DoSequence(DG.Tweening.Tween[] tweens,int loopNum=-1)
    {
        Sequence seq=DOTween.Sequence();
        for(int i=0;i<tweens.Length;i++)
        {
            seq.Append(tweens[i]);
        }
        seq.SetLoops(loopNum);
    }

    public static void SetTweenerDefault(Tweener tweener,Ease easeType,Action callback)
    {
        tweener.SetUpdate(true);
        tweener.SetEase(easeType);
        if(callback!=null)
        {
            tweener.onComplete=()=>callback();
        }
    }

    //---------------------------------------------------------------
    public static Tweener DOAnchoredMove(RectTransform rect,Vector2 endPos,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=rect.DOAnchorPos(endPos,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    public static Tweener DOAnchoredMoveX(RectTransform rect,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=rect.DOAnchorPosX(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    public static Tweener DOAnchoredMoveY(RectTransform rect,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=rect.DOAnchorPosY(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    //---------------------------------------------------------------
    public static Tweener DoMove(Transform t,Vector3 endPos,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOMove(endPos,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    public static Tweener DoMoveX(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOMoveX(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }
    public static Tweener DoMoveY(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOMoveY(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }
    public static Tweener DoMoveZ(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOMoveZ(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    //---------------------------------------------------------------
    public static Tweener DoLocalMove(Transform t,Vector3 endPos,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOLocalMove(endPos,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    public static Tweener DoLocalMoveX(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DoLocalMoveX(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }
    public static Tweener DoLocalMoveY(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DoLocalMoveY(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }
    public static Tweener DoLocalMoveZ(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DoLocalMoveZ(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    //---------------------------------------------------------------
    //Scale
    public static Tweener DoScale(Transform t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOScale(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }
    
    //---------------------------------------------------------------
    //Slider
    public static Tweener DoSliderValue(Slider t,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=t.DOValue(endValue,duration,false);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    //---------------------------------------------------------------
    public static void DoPingPongScale(Transform t,float fromScale,float toScale,float duration)
    {
        Tweener tweener=t.DOScale(toScale,duration);
        SetTweenerDefault(tweener,easeType,()=>DoPingPongScale(toScale,fromScale,duration));
    }

    public static void DoPingPongLocalMove(Transform t,Vector3 fromPos,Vector3 toPos,float duration,Ease easeType=Ease.Linear)
    {
        Tweener tweener=t.DOLocalMove(toPos,duration,false);
        SetTweenerDefault(tweener,easeType,()=>DoPingPongLocalMove(toPos,fromPos,duration));
    }

    public static Tweener DoLoopRotate(Transform t,Vector3 endValue,float duration)
    {
        Tweener tweener=t.DOLocalRotate(endValue,duration,RotateMode.FastBeyond360);
        tweener.SetLoops(-1);
        return tweener
    }

    public static Tweener DoRotate(Transform t,Vector3 endValue,float duration,Action callback=null,Ease easeType=Ease.Linear,RotateMode mode=RotateMode.FastBeyond360)
    {
        Tweener tweener=t.DOLocalRotate(endValue,duration,mode);
        SetTweenerDefault(tweener,easeType,callback);
        return tweener;
    }

    public static Tweener DoAlpha(Graphic g,float endValue,float duration,Ease easeType=Ease.Linear,Action callback=null)
    {
        Tweener tweener=g.DOFade(endValue,duration)
        SetTweenerDefault(tweener,easeType,callback);
    }

    public static void DoKill(Component comp,bool isComplete=false)
    {
        comp.DOKill(isComplete);
    }
}

常见用法

  • 文本的打字机效果
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;

public class DOText:MonoBehaviour
{
    private Text txt;
    private void Start()
    {
        string str="这是一个打字测试";
        txt=GetComponent<Text>();
        txt.text="";
        text.DOText(str,3.0f);
    }
}
  • 镜头的抖动
using UnityEngine;
using DG.Tweening;
//此脚本挂在相机上
public class DOCamera:MonoBehaviour
{
    private void Start()
    {
        transform.DOShakePosition (2f, Vector3.one*2);
    }
}
  • 本文作者: Calmer
  • 本文链接: https://mytechplayer.com/archives/dotween的使用
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
# 插件
Unity3D插件和工具
TimerUtils工具(时间、定时器、间隔执行)
  • 文章目录
  • 站点概览
Calmer

Calmer

88 日志
7 分类
10 标签
RSS
Creative Commons
0%
© 2020 — 2025 Calmer
由 Halo 强力驱动
蜀ICP备20010026号-1川公网安备51019002006543
Copyright © 2020-2025 Calmer的文章