前言
- 为什么要使用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);
}
}