DoTween
DoTween从何而来
在NGUI中提供了UITween 来支持UI的动画编写,极度降低了代码的复杂度,然而,我们的UGUI中并没有类似UITween的功能进行支撑,所以我们用到了第三方插件 DoTween。
在我们Unity官方的UGUI的Demo中UI的动画是使用Animator来制作的,试想一下,如果我们的UI如果需要动画效果,那么就需要使用 AnimationController,除此之外,还需要去编辑动画,如果数量不多
的UI可以这样,如果UI过多的需要动画,那么工作量就有些庞大了。所以现在市面上绝大多数使用UGUI开发的公司都使用了DoTween来辅助完成UI动画的设计,当然,DoTween也可以应用到3D物体上
记得大概2014年的时候就有了这款插件,这款插件最开始的时候就是应用到3D游戏物体上的动画,后来才被扩展到UGUI中
主要的方法(就是最常用的):
1.以DO开头的方法:就是补间动画的方法。例如:transform.DOMoveX(100,1)
2.以Set开头的方法:设置补间动画的一些属性。例如:myTween.SetLoops(4, LoopType.Yoyo)
3.以On开头的方法:补间动画的回调方法。例如:myTween.OnStart(myStartFunction)
1.导入插件:
插件我们在官网中可以直接下载,而且是免费的,直接点击下载导入就可:![](https://img-blog.csdnimg.cn/20201110182416179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzUxMTg3MQ==,size_16,color_FFFFFF,t_70#pic_center)
这里点击这个就行:
后面会出现一个DoTween可以控制的一些方法:直接点击Apply
然后呢,我们随便建立一个脚本,如下:
这个时候我们是不能用DoTween的,要在开头加一个引用:Using DG.Tweening
之后就可以使用Do Tween的方法了;
这里先用一些简单的例子来使用DOTwenn的方法:
public class Text : MonoBehaviour
{
public Vector3 value = new Vector3(0, 0, 0);
private void Start()
{
//() => value表示返回获取value值
//x => value = x,x是通过目标值计算出来的插值,赋值给value
//new Vector3(10, 10, 0)是目标值
//2是到达目标值的时间
DOTween.To(() => value, x => value = x, new Vector3(10, 10, 0), 2);
}
// Update is called once per frame
void Update()
{
//value的值每帧赋值给物体,来达到使物体运动的效果
transform.position = value;
}
}
这些代码复制进去,然后把我们创建的脚本,放到相应的物体上
点击运行,这时候我们就可以看到物体2秒内移动的效果了,
这是To的方法移动
然后我们使用直接改变物体transfrom的方法使得物体移动,比如我让方块从0,0,0 =>10,10,10
先把之前代码删掉,然后开始,我们只需要把别的代码删掉,加一行代码就够了,然后点击运行就会看到
public class Text : MonoBehaviour
{
private void Start()
{
//我们脚本赋值在哪个物体上,这就是哪个物体的transfrom(也就是位置)
//new Vector3(10, 10, 10)这是物体要移动的到的位置
//2是两秒之后移动到那个地方去
transform.DOLocalMove(new Vector3(10, 10, 10), 2);
}
// Update is called once per frame
void Update()
{
}
}
另外 还有当我在这个后面加上From()时,就是倒放效果
transform.DOLocalMove(new Vector3(10, 10, 10), 2).From();//倒放,也就是从目标位置移动到当前位置
这里我们还可以设置动画曲线:然我们达到缓动或者各种曲线的效果
比如·:
transform.DOLocalMove(new Vector3(10, 10, 10), 2).SetEase(Ease.InOutFlash);
另外,我们不仅可以控制物体的移动,还有控制物体的大小,旋转,都是OK的;
代码也大都一样:
transform.DORotate(new Vector3(90, 90, 90), 2f);
transform.DOScale(new Vector3(2, 2, 2), 2);
然后还有DoText:文字打印效果
text.DOText(“云想衣裳花想容,春风拂槛露华浓”, 2);
DOColor()修改颜色
text.DOColor(Color.red, 2);
DOFade()透明度渐变
text.DOFade(1, 2);
代码:
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;//这里注意要加命名空间
using DG.Tweening;
public class Test : MonoBehaviour
{
//定义Text的字段
private Text text;
private void Start()
{
//在我赋值的物体上找到Text这个组件
text = gameObject.GetComponent<Text>();
//文字打印机效果
text.DOText("xxxxxxxxxxx", 4);
//文字颜色渐变
text.DOColor(Color.red, 4);
//文字透明度渐变
text.DOFade(1, 4);
}
}
创建一个Text
然后运行就可以看到效果了
DOShakePosition() 震动效果
//Camera.main是主摄像机
//1,是震动频率
//0.5f是时间
Camera.main.transform.DOShakePosition(1, 0.5f);
SetLoops()设置循环播放次数
cube.transform.DOMoveX(5, 1).SetEase(Ease.InCubic).SetLoops(2);
OnComplete()当动画结束时运行的事件函数
cube.transform.DOMoveX(5, 1).OnComplete(() => { Debug.Log(“End”); });
OnStart()当动画第一次运行时的事件函数
cube.transform.DOMoveX(5, 1).OnStart(() => { Debug.Log(“Start”); });