DoTween插件的基本操作总结

插件说明

DoTween是unity资源商店下一个做补间动画的常用插件,可以在资源商店中直接下载导入,通过unity工具栏的Tools/Demigiant/DoTween Utility Panel打开面板进行开启,并在代码中引用DG.Tweening的命名空间即可使用它的接口。
DoTween分专业版和免费版,以下仅针对免费版的操作进行总结。

接口使用

Dotween包括Tweener(补间,控制值并为其生成动画)、Sequnece(序列,控制多个补间作为组来处理)、Tween(通用词表示补间和序列)、NestedTween(嵌套补间,序列中包含的补间)四种命名法。

以及DO、Set、On的三种笼统上分别表示补间效果、参数设置、回调的前缀。

下面将从三种命名法分开来通过对每个接口的使用案例来对其进行说明,也方便接口的查阅

DO方法

Tweener

物体移动、旋转、缩放
transform.DOMove(Vector3.one, 2);//2秒移动到(1,1,1)位置
transform.DOMoveX(3f,2);//x移动到3.0位置
transform.DOLocalMove(Vector3.one, 2);//按自身坐标系移动到目标位置
transform.DORotate(Vector3.one*30, 2);//2秒旋转到(30,30,30)的角度
transform.DOScale(Vector3.one*20,2);//将物体的Scale2秒缩放到(20,20,20)
动画混合运算
//2秒移动到(1,1,1),即将移动到(4,4,4)和移动到(-3,-3,-3)进行了混合
transform.DOBlendableMoveBy(Vector3.one * 4, 2f);
transform.DOBlendableMoveBy(Vector3.one * (-3), 2f);
物体颤动及震动
transform.DOPunchPosition(new Vector3(3, 3, 3), 2, 3, 0.1f);//以颤动系数为0.1在2秒内经过三次颤动到达(3,3,3)位置
transform.DOShakePosition(3f, 1, 10, 90);//在3秒的时间内以强度为1、随机角度为90度震动10次
材质动画控制

颜色与透明度

Material mat = GetComponent<MeshRenderer>().material;
mat.DOColor(Color.red, "MainColor", 2);//将材质shader中属性MainColor在2秒内变为红色
mat.DOColor(Color.clear, "MainColor", 2);//将材质shader中属性MainColor在2秒内变透明
mat.DOFade(0, "MainColor", 2);//将材质shader中代表颜色的属性MainColor在2秒内将透明度变为0
mat.DOVector(Color.clear, "MainColor", 2);//将材质shader中属性MainColor在2秒内变透明

渐变

Gradient gradient;
mat.DOGradientColor(gradient ,"MainColor", 2);//2秒将材质的shader中属性MainColor变为预设渐变gradient

偏移值

mat.DOOffset(new Vector2(1, 1), 2);//2秒将材质的shader中偏移值变为(1,1)

动画混合

//混合,将材质shader中属性MainColor在2秒内变为黄色
mat.DOBlendableColor(Color.red, "MainColor", 2);
mat.DOBlendableColor(Color.green, "MainColor", 2);
相机动画控制
Camera cam = Camera.main;
//宽高比
cam.DOAspect(16 / 9,2);//2秒时间将相机宽高比变为16:9
//颜色
cam.DOColor(Color.red, 2);//2秒时间将相机颜色变到红色,对应相机的Background属性
//远近截面
cam.DONearClipPlane(1f, 2);//2秒时间将相机近截面变到1,对应相机的clipping Plane Near的属性
cam.DOFarClipPlane(10f, 2);//2秒时间将相机远截面变到10,对应相机的clipping Plane Near的属性
//相机视域
cam.DOFieldOfView(100, 2);//2秒时间将透视相机的FieldOfView属性变为100
cam.DOOrthoSize(10, 2);//2秒时间将正交相机的Size属性变为100
//分屏
cam.DORect(new Rect(0, 0, 0.5f, 0.5f), 2);//2秒时间将相机的Viewport Rect属性变为(0,0,0.5f,0.5f)
cam.DOPixelRect(new Rect(0, 0, 960, 540), 3f);//2秒时间将相机根据像素设置Viewport Rect属性为(0,0,960/相机的宽,540/相机的高)
//相机震动
cam.DOShakePosition(3f, 1, 10, 90);//在3秒时间内相机以强度为1、随机角度为90度震动10次
文本框打字机效果
public Text text;
text.DOText("这是一个字符串", 5);//5秒时间以打字机形式在text上显示字符串

Sequence

append

Sequence sequence = DOTween.Sequence();
sequence.Append(transform.DOMove(Vector3.one, 3));//物体先3秒移动到(1,1,1)
sequence.AppendInterval(1);//然后在(1,1,1)停止运动1秒
sequence.Append(transform.DOMove(-Vector3.one , 2));//接着2秒时间运动到(-1,-1,-1)

Insert

//最终效果:
//0s-2s移动到(-1,-1,-1)并缩放到(2,2,2)
//2s-3s从(2/3,2/3,2/3)移动到(1,1,1)
//tip:中间(1,1,1)到(2/3,2/3,2/3)会直接跳过去,总时长不变;
//然后3s-4s不动,4-6移动到(3,3,3)
sequence.Append(transform.DOMove(Vector3.one, 3));//物体3秒移动到(1,1,1)
sequence.Insert(0, transform.DOMove(-Vector3.one, 2));//覆盖掉0到2秒的时间执行物体移动到(-1,-1,-1)的动画
sequence.Insert(0, transform.DOScale(Vector3.one*2, 2));//0到2秒的时间执行物体缩放到(2,2,2)的动画
sequence.Insert(4, transform.DOMove(Vector3.one * (3), 2));

Join

//效果:0-3s移动到(1,1,1)位置的同时缩放到(2,2,2)
sequence.Append(transform.DOMove(Vector3.one, 3));
sequence.Join(transform.DOScale(Vector3.one * 2,3));

Prepend

//0s-2s移动到(-1,-1,-1)然后2s-5s移动到(1,1,1);
sequence.Append(transform.DOMove(Vector3.one, 3));
sequence.Prepend(transform.DOMove(-Vector3.one, 2));

路径动画

基本使用

public Transform[] listTrans;
var listPos = listTrans.Select(u => u.position).ToArray();
transform.DOPath(listPos,5,PathType.CatmullRom,PathMode.Full3D,10,Color.red);//沿listPos的路径以曲线、完全3d空间下、每段分1-个点的形式5s执行完动画,编辑器下路径的颜色为红色

常用参数设置:

transform.DOPath(listPos, 5).SetOptions(true, AxisConstraint.X, AxisConstraint.None);沿listPos的路径锁定x轴的位置变化,不锁定旋转5s执行完路径动画
transform.DOPath(listPos, 5).SetLookAt(0f);//参数范围为0-1,表示与正前方偏移的角度

Set方法

参数设置方式

直接在末尾以"."连接的方式设置相应参数

//参数设置
transform.DOMove(Vector3.one, 1).SetLoops(3, LoopType.Yoyo);//以Yoyo的方式循环执行三次1秒移动到(1,1,1)的动画,LoopType.Yoyo为来回循环,LoopType.Restart为每次执行完毕后会返回原点,Incremental为递增,会朝着目标方向不返回的前进指定次数。第一个参数次数为-1时则为无线循环

定义TweenParams实例,多用于多动画统一设置

TweenParams tweenParams = new TweenParams();
tweenParams.SetLoops(-1, LoopType.Yoyo);
transform.DOMove(Vector3.one,1).SetAs(tweenParams);

Dotween的类方法

var list = DOTween.PausedTweens();//所有暂停的动画
list = DOTween.PlayingTweens();//所有正在播放的动画
DOTween.TweensById("id", true);//找到id为"id"并正在播放的动画
DOTween.TweensByTarget(transform,true);//找到tranforn上正在播放的动画
DOTween.IsTweening(transform);//判断动画是否在运行
DOTween.TotalPlayingTweens();//正在播放的动画数量(包含正处于延迟中的动画)

Tween tween= transform.DOMove(Vector3.one, 4).SetLoops(4);
Debug.Log(tween.fullPosition);//获取动画的位置
tween.fullPosition = 2;//设置动画的位置
Debug.Log(tween.CompletedLoops());//获取动画已经完成的循环次数,从0开始
Debug.Log(tween.Duration(false));//获取动画不包含循环的时长
Debug.Log(tween.Elapsed(false));//获取动画不包含循环已经执行完成的时间
Debug.Log(tween.ElapsedPercentage(false));//获取动画不包含循环已经执行完成的时间的百分比
Debug.Log(tween.IsActive());//获取动画是否为活动状态

动画的基本参数设置

transform.DOMove(Vector3.one, 1).SetAutoKill(false);//动画不会自动销毁
transform.DOMove(Vector3.one,1).From(true);//为true时从物体位置加上向量(1,1,1)的位置移动到原物体位置,为空或为false时为从(1,1,1)位置移动到原位置

transform.DOMove(Vector3.one, 1).SetDelay(2);//延迟2秒执行动画
transform.DOMove(Vector3.one, 4).SetSpeedBased(true);//true或不写参数时为以4个单位的速度移动到(1,1,1)false时为以4秒时间移动到目标位置

transform.DOMove(Vector3.one, 4).SetId("001");
DOTween.Play("001");

transform.DOMove(Vector3.one, 4).SetRecyclable(true);//设置为可回收对象,dotween本身会自动回收
transform.DOMove(Vector3.one, 3).SetRelative();//向着在原位置基础上增加(1,1,1)的位置移动

transform.DOMove(Vector3.one, 3).SetUpdate(UpdateType.Normal, true);//动画会受Time.timeScale控制

动画曲线

调用dotween预设动画曲线来进行直接设置

transform.DOMove(Vector3.one, 3).SetEase(Ease.Linear);//匀速运动到(1,1,1)

使用unity动画曲线组件自定义动画曲线的方式进行设置

public AnimationCurve  animationCurve;
transform.DOMove(Vector3.one, 4).SetEase(animationCurve);//以自定义曲线设置动画曲线

自定义函数设置动画曲线:

transform.DOMove(Vector3.one, 4).SetEase((float time,float duration, float overshootOrAmplitude, float period) =>{
    return time / duration;//匀速的案例-》当前时间/总时间
});

动画的基本操作方法

transform.DOMove(Vector3.one, 4);
transform.DORestart();//动画重新播放
transform.DORewind();//动画重新回到开始位置
transform.DOSmoothRewind();//动画平滑的回到开始位置
transform.DOPlay();//播放动画
transform.DOPause();//暂停动画
transform.DOFlip();//动画反转
transform.DOGoto(1, true);//跳到第一秒位置并播放
transform.DOPlayForward();transform.DOPlayBackwards();//播放/倒放
transform.DOTogglePause();//每次调用会在播放和暂停中切换

On

常用的回调方法

transform.DOMove(Vector3.one, 4).OnComplete(() => { Debug.Log("动画播放完成"); });
transform.DOMove(Vector3.one, 4).OnStart(() => { Debug.Log("动画开始播放"); });
transform.DOMove(Vector3.one, 4).OnPause(() => { Debug.Log("动画暂停播放"); });
transform.DOMove(Vector3.one, 4).OnRewind(() => { Debug.Log("动画重新播放"); });

Sequence中的回调函数

sequence.InsertCallback(2, () =>{ Debug.Log("在2秒处插入了回调"); });
sequence.PrependCallback(() =>{ Debug.Log("在序列开始添加了回调"); });
sequence.AppendCallback(() => { Debug.Log("在序列末尾添加了回调"); });

协程中的常用方法

Tween tween = transform.DOMove(Vector3.one, 4).SetLoops(4);
StartCoroutine("Func");
IEnumerator Func()
{
    yield return tween.WaitForCompletion();//等待动画执行完毕后
    yield return tween.WaitForElapsedLoops(3);//等待动画执行完3次循环之后
    yield return tween.WaitForKill();//等待动画销毁
    yield return tween.WaitForPosition(2);//等待动画执行到2秒位置
    yield return tween.WaitForRewind();//等待动画重新开始
    yield return tween.WaitForStart();//等待动画开始
}

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>