什么是DOTween?
用于实现物体的补间动画。DOTween可以很容易的制作出如位移,旋转,缩放等动画效果。它可以给UI以及其他的一些游戏物体加入动画效果。
通用的方式
对变量进行动画
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class GetStart : MonoBehaviour {
public Vector3 myVector = new Vector3(0, 0, 0);
// Start is called before the first frame update
void Start() {
//对变量做一个动画(通过插值的方式去修改一个值的改变)
DOTween.To(() => myVector, x => myVector = x, new Vector3(10, 10, 10), 2);
}
}
控制Cube动画
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class GetStart : MonoBehaviour {
public Vector3 myVector = new Vector3(0, 0, 0);
public Transform cubeTransform;
// Start is called before the first frame update
void Start() {
//对变量做一个动画(通过插值的方式去修改一个值的改变)
DOTween.To(() => myVector, x => myVector = x, new Vector3(10, 10, 10), 2);
}
void Update() {
//同步值的修改
cubeTransform.position = myVector;
}
}
对UI进行动画
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class GetStart : MonoBehaviour {
public Vector3 myVector = new Vector3(0, 0, 0);
public RectTransform imageRectTransform;
// Start is called before the first frame update
void Start() {
//对变量做一个动画(通过插值的方式去修改一个值的改变)
DOTween.To(() => myVector, x => myVector = x, new Vector3(0, 0, 0), 2);
}
void Update() {
//同步值的修改
imageRectTransform.localPosition = myVector;
}
}
上面的使用动画的方式比较麻烦,需要要定义值,对值进行变化,还要同步值的修改。
快捷方式
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ButtonController : MonoBehaviour {
public RectTransform imageRectTransform;
public void OnButtonClick() {
//imageRectTransform.DOMove(new Vector3(0, 0, 0), 1); //让imageRectTransform从当前位置动画到(0,0,0)的位置 时间为1s(修改的是世界坐标)
//因为UI上是局部坐标,所以使用DOLocalMove
imageRectTransform.DOLocalMove(new Vector3(0, 0, 0), 1);
}
}
前放和倒放:DOPlayForward( )和DOPlayBackwards( )
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ButtonController : MonoBehaviour {
public RectTransform imageRectTransform;
//标志位,用来判断是进入还是出去
public bool isIn=false;
//放在这,只执行一次,只会出现一个Tweener
void Start() {
//因为UI上是局部坐标,所以使用DOLocalMove
Tweener tweener = imageRectTransform.DOLocalMove(new Vector3(0, 0, 0), 1);//默认动画播放完成会销毁
//Tweener对象保存这个动画的信息,每次调用do类型的方法都会创建Tweener对象,这个对象是由dotween来管理
tweener.SetAutoKill(false);//把自动销毁设置为false
tweener.Pause();//暂停
}
public void OnButtonClick() {
if (!isIn) {
//进入屏幕
imageRectTransform.DOPlayForward();//前放
isIn = true;
} else {
//离开屏幕
imageRectTransform.DOPlayBackwards();//倒放
isIn = false;
}
}
}
From( )
transform.DOMoveX(5, 3).From();
:从目标坐标,移动到当前坐标。例如当前坐标(1,0,0),目标坐标(5,0,0),那么就是从(5,0,0)移动到(1,0,0)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class MyCube : MonoBehaviour {
void Start() {
//从当前位置移动到目标位置(5,0,0)
//transform.DOMoveX(5,3);
//加了From后,从目标位置移动到当前位置
transform.DOMoveX(5, 3).From();
}
}
transform.DOMoveX(5, 3).From(true);
:从当前坐标+目标坐标,移动到当前坐标。例如当前坐标(1,0,0),目标坐标(5,0,0),那么就是从(6,0,0)移动到(1,0,0)。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class MyCube : MonoBehaviour {
void Start() {
//从当前坐标+目标坐标,移动到当前坐标。
transform.DOMoveX(5, 3).From(true);
}
}
动画属性设置(动画曲线和事件函数)
DOTween的动画曲线默认是一个抛物线,效果如上图所示。我们可以使用SetEase( )设置不同的动画曲线。
SetEase( ):动画曲线设置(缓动曲线图)
Ease.InBack :函数图可参考链接
效果如图:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ImageController : MonoBehaviour {
void Start() {
Tweener tweener = transform.DOLocalMoveX(0, 5);
tweener.SetEase(Ease.InBack);
}
}
Ease.InBounce:函数图链接
效果如图所示:
Ease.InCirc:函数图链接
效果如图所示。
其他的可自行测试。
OnComplete():事件函数,动画播放完调用另一个方法。
效果:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ImageController : MonoBehaviour {
void Start() {
Tweener tweener = transform.DOLocalMoveX(0, 5);
tweener.SetEase(Ease.InBounce);//动画曲线
tweener.OnComplete(OnTweenComplete);//动画结束事件
}
void OnTweenComplete() {
print("OnComplete");
}
}
SetLoops():设置动画循环次数
效果:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class ImageController : MonoBehaviour {
void Start() {
Tweener tweener = transform.DOLocalMoveX(0, 5);
tweener.SetEase(Ease.InBounce);//动画曲线
tweener.SetLoops(2);//循环2次
}
}
对话框文字动画:DOText( )
效果:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class MyText : MonoBehaviour {
private Text text;
void Start() {
text = GetComponent<Text>();
text.DOText("北冥有鱼,其名为鲲,鲲之大,一锅炖不下,化而为鸟,其名为鹏," +
"鹏之大,需要两个烧烤架,一个密制一个微辣,来瓶雪花我们勇闯天涯。", 10);//10秒显示文字动画
}
}
Text字体颜色渐变:DOColor()
效果:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class MyText : MonoBehaviour {
private Text text;
void Start() {
text = GetComponent<Text>();
text.DOColor(Color.red, 2); //2秒内颜色渐变动画
}
}
Text透明度渐变:DOFade()
效果:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;
using DG.Tweening;
public class MyText : MonoBehaviour {
private Text text;
void Start() {
text = GetComponent<Text>();
text.DOFade(1, 10);//第一个参数为透明度,0为不透明,1为完全透明,第二个参数为渐变时间
}
}
屏幕震动效果:DOShakePosition()
使摄像机发生随机方向上的位移,以此来实现屏幕震动效果。
效果:
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using DG.Tweening;
public class MyShakeCamera : MonoBehaviour {
// Start is called before the first frame update
void Start() {
//transform.DOShakePosition(1);//震动时间1秒,默认方向随机,震动强度为1
//震动时间1秒,方向为x,y方向,震动强度为3
transform.DOShakePosition(1, new Vector3(3, 3, 0));
}
}
更多的API可以参考DOTween官方文档。