使用的时候引入using DG.Tweening的命名空间
——DOTween与Itween都可以实现补间动画
——iTween调用方式复杂,需要自己去拼接一个Hashtable,也就是说需要记住各种字符串名称
——DOTween直接使用点调用就可以了,而且可以链式编程(无限的点)
——DOTween执行效率更高,性能好
——Do:是所有的tween的快捷方式前缀,也是DOTween类主要的前缀
——Set:是所有的tween设置前缀
——On:所有的tween回调前缀
——DOTween的通用方式,也是DOTween快捷方式的内部实现,当没有快捷方式的情况下,通用方式可以补间任何东西
//DOTween(()=>要改变的属性,自定义的插值变量=>要改变的属性=自定义的插值变量,目标值,完成动画的时间)
DOTween.To(() => transform.position, doPos => transform.position = doPos, new Vector3(1, 1, 1), 2);
——移动
//DOMoveX(目标值,完成动画的时间,[是否计算出的插值都捕捉为整数]=false)
transform.DOMoveX(100, 2);
——旋转
//DORotate(目标值,完成动画的时间,[旋转模式,默认Fast模式旋转不会超过360度,FastBeyond360模式旋转将超过360度]=Fast)
transform.DORotate(new Vector3(0, 0, 90), 2);
//DORotateQuaternion(目标值,完成动画的时间)——此方法不推荐使用
transform.DORotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);
//DOLookAt(目标值,完成动画的时间,[旋转的最终轴约束]=None)
transform.DOLookAt(new Vector3(1, 1), 2);
——缩放
//DOScale(目标值,完成动画的时间)
transform.DOScale(new Vector3(2, 2, 2), 2);
——跳跃
//DOJump(目标值,跳跃的力量-Y轴的偏移量,跳跃的次数,完成动画的时间,[是否计算出的插值都捕捉为整数]=false)
transform.DOJump(new Vector3(10, 0, 0), 10, 10, 2);
——冲击与震动
//DOPunchPosition(目标值,完成动画的时间,[冲击次数]=10,[弹力,0表示在起始位置范围冲击,1表示在目标位置范围冲击]=1,[是否计算出的插值都捕捉为整数]=false)
transform.DOPunchPosition(new Vector3(10, 0, 0), 2);
transform.DOPunchRotation(new Vector3(0, 0, 90), 2);
transform.DOPunchScale(new Vector3(2, 2, 3), 2);
//DOShakePosition(完成动画的时间,[震动强度-Vector3或者float都可以]=1,[震动次数]=10,[随机性]=90,[是否淡出]=true,[是否计算出的插值都捕捉为整数]=false)
transform.DOShakePosition(2);
transform.DOShakeRotation(2);
transform.DOShakeScale(2);
——Image与Text
//DOFade(目标值,完成动画的时间)
img.DOFade(0, 2);
img.DOColor(Color.blue, 2);
//DOText(目标值,完成动画的时间,[是否正确解释富文本]=true,[加密模式]=None)
txt.DOText("DOTween文字",2);
——相机
camera.DOAspect(宽高比的值,改变到指定宽高比需要的时间);
camera.DOColor(要改变到的指定颜色,改变到指定颜色需要的时间);
camera.DOFarClipPlane(要改变到的远切面的值,改变到指定远切面的值需要的时间);
camera.DONearClipPlane(要改变到的近切面的值,改变到指定近切面的值需要的时间);
camera.DOFieldOfView(要改变到的视野范围的值(透视相机),改变到指定视野范围的值需要的时间);
camera.DOOrthoSize(要改变到的视野范围的值(正交相机),改变到指定视野范围的值需要的时间);
camera.DOPixelRect(显示的相机范围(用多个相机实现分屏效果),改变到指定视野范围的值需要的时间);
camera.DORect(显示的相机范围(用多个相机实现分屏效果0-1比例),改变到指定视野范围的值需要的时间);
camera.DOShakePosition(持续时间,[震动强度],[震动次数],[震动的随机性]);
camera.DOShakeRotation(持续时间,[震动强度],[震动次数],[震动的随机性]);
——DOTween的一些设置
//SetLoops(循环次数,[循环类型]=Restart)——设置为-1则无限循环
tween.SetLoops(3);
//SetAutoKill([动画播放完是否就被杀死]=true)——为了节约性能
tween.SetAutoKill(false);
//SetEase(动画缓动类型)
tween.SetEase(Ease.Flash)
DoTween缓动动画示例:http://robertpenner.com/easing/easing_demo.html
DoTween缓动动画说明:https://blog.csdn.net/yy763496668/article/details/78215014
tween.From([是否为一个增量运动]);
tween.SetDelay(延迟的时间);
tween.SetSpeedBased([是否以速度为基准]);
tween.SetId("设置的ID名");
tween.SetRecyclable(是否回收);
tween.SetRelative(是否为一个增量动画);
tween.SetUpdate(Update类型,[是否忽略时间缩放]);
——DOTween的一些方法
//Play——播放(只能播一次,PlayForward和PlayBackwards可以依次轮换播放无数次)
tween.Play();
//Pause——暂停
tween.Pause();
//PlayForward——正播(必须设置SetAutoKill为false)
tween.PlayForward();
//PlayBackwards——倒播(必须设置SetAutoKill为false,必须正播之后才可以倒播)
tween.PlayBackwards();
//Restart——重新播放
tween.Restart();
//Goto(定格到动画的指定时间点,[定格之后是否继续播放]=false)
tween.Goto(1);
//Rewind——直接回退到动画最初
tween.Rewind();
//SmoothRewind——平滑的回退到动画最初
tween.SmoothRewind();
//TogglePause——如果动画处于播放状态则暂停,如果动画处于暂停状态则播放
tween.TogglePause();
——回调函数
//OnComplete——整个动画完成时(包括循环)
tween.OnComplete(回调方法);
//OnStepComplete——单个循环周期完成时(不包括循环)
tween.OnStepComplete(回调方法)
//OnPlay——动画播放时
tween.OnPlay(回调方法);
//OnPause——动画暂停时
tween.OnPause(回调方法);
//OnRewind——动画退回最初时
tween.OnRewind(回调方法);
//OnPlay——动画播放时
tween.OnPlay(回调方法);
//OnKill——动画被杀死时
tween.OnKill(回调方法);
——融合
1.用Blend实现的值会相加融合到一起—例如初始点为(1,1,1),两次移动的值分别为(1,1,1)和(-1,-1,-1),则最终移动到的值为(1,1,1)
2.用Blend实现的是增量动画—例如初始点是(1,1,1),移动(1,1,1),则移动到的值为(2,2,2)
//DOBlendableMoveBy(目标值,完成动画的时间,[是否计算出的插值都捕捉为整数]=false)
transform.DOBlendableMoveBy(new Vector3(10, 0, 0), 1);
transform.DOBlendableMoveBy(new Vector3(-10, 0, 0), 1);
——材质改变颜色
//DoColor(改变到的指定颜色,["需要改变的Shader的名字"(若Shader类型没有_Color属性则需要传递名字)],完成动画的时间);
mat.DOColor(Color.red, 1);
——动画序列
//创建一个动画序列
Sequence sequence = DOTween.Sequence();
//给动画序列的末尾添加Tween类型动画——会等待上一个Append的动画播放完再播放下一个
sequence.Append(transform.DOMoveX(3, 1));
//给动画序列的开头添加Tween类型动画(类似与栈,后添加的先执行)
sequence.Prepend(transform.DOMoveX(45, 1));
//给动画序列添加Tween类型动画——会与上一个Append的动画一起播放
sequence.Join(transform.DORotate(new Vector3(0, 0, 90), 1));
//给前后两个动画设置间隔时间
sequence.AppendInterval(1);
//给前后两个动画设置间隔时间(类似与栈,后添加的先执行)
sequence.PrependInterval(1);
//给动画序列的指定时间点插入动画——插入的动画会覆盖掉同时间点的其他动画
sequence.Insert(1, transform.DOMoveX(3, 1));
//给动画序列的末尾添加回调函数
sequence.AppendCallback(回调函数);
//给动画序列的开头添加回调函数
sequence.PrependCallback(回调函数);
//给动画序列指定时间点插入回调函数——
sequence.InsertCallback(1, 回调函数);
——路径动画
//DoPath(Vector类型的数组,完成动画的时间,[动画类型=Linear],[动画模式=Full3D,[路径点之间的曲线由多少个点组成=10(点越多曲线越平滑)],[Scene视图下路径曲线的颜色=null])
transform.DOPath(vector, 5);
//将Transform数组转化为Vector3数组
using System.Linq;
Transform[] wayPoints;
Vector3[] vector = wayPoints.Select(u => u.position).ToArray();
——使用DoKill手动杀死动画
Tween动画播放完默认是自动杀死的,但是有些时候Tween动画是循环的我们需要手动杀死动画
经过测试,直接使用DOTween.Kill(tween动画)是不成功的,有以下两种办法:
//方法1:先设置Tween的Id,在Kill方法参数中传入Id名
tween.SetId("MyTween");
DOTween.Kill("MyTween");
//方法2:Kill方法参数中传入intId
DOTween.Kill(tween.intId);