transform.DOMove(Vector3.one, 2); // 移动到目标位置,时长为2秒
transform.DOScale(2, 2); //扩展到目标 Scale , 时长为2秒
transform.DOPunchPosition(transform.forward,2); //让物体在目标位置之间来回移动,时间结束后,停止移动,就像被一拳打倒墙上一样,
transform.DOShakePosition(2,5,45,10); //震动的效果,(时长,震动强度,频率,角度),
transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 3);
transform.DOBlendableMoveBy(new Vector3(2, 2, 2), 3);
混合Move(),使用之后会将混合树里面所有的向量相加,得到一个目标向量,再使目标移动到目标位置
,如果混合树里只有一个向量,那么会返回这个向量
改变物体透明度的两种方式
mMat = GetComponent<MeshRenderer>().material;
mMat.DOColor(Color.clear, 2);
mMat.DOFade(0,2);
第一种,是让材质的颜色清空,
第二种,设置一个目标Alpha值,下一个参数是时间,物体会随时间渐变到目标透明值
mMat.DOGradientColor(mGradient, 3);
声明一个公共的渐变器,使用此函数可以令渐变器在3秒中内变化
mMat.DOOffset(new Vector2(1, 1), 2);
此函数可以改变物体材质贴图的偏移量,可以用于创造水流动的效果,2秒中让物体贴图偏移到目标位置
修改物体的透明值,
mMat.DOColor(Color.clear, 2);
mMat.DOFade(0, "_Color", 2); //这种方式更好
如果DoClolr有两个,那么只会执行最后面的那个,之前的都不会执行
mMat.DOColor(Color.red, 2);
mMat.DOColor(Color.green, 2);
那么物体会直接变成,绿色,
如果使用的是混合方式,
mMat.DOBlendableColor(Color.black,2);
mMat.DOBlendableColor(Color.white,2);
程序将会和 moveBlend一样,会将两种颜色进行混合, 返回一个中间值,再变化
Camera
mCamera.DOAspect(1, 2);
可以改变摄像机的比例
同理还有
mCamera.DONearClipPlane(1.1f, 2);
mCamera.DONearClipPlane(5f, 2);
对摄像机照射到的远近进行控制
Field of view 视域,对摄像机照射的大小进行控制
对于正交摄像机则使用
mCamera.DOFieldOfView(10, 2); // 透视摄像机的视域
mCamera.DOOrthoSize(10, 2);//正交摄像机的size
对摄像机的分屏操作
mCamera.DORect(new Rect(0.5f, 0.5f, 0.5f, 0.5f), 2);
mCamera.DOPixelRect(new Rect(0, 0, 300, 400), 2);
5个参数,前面两个指定位置,后两个指定摄像机的size ,第一种函数使用的是比例的方式,第二种是指定的具体数值,最后一个参数是转换的时间
Text
打字机效果,让Text以某种速度打印出一行字符串
mText.DOText("你醒啦", 1f).SetEase(Ease.Linear);
输入想输出的字符,然后以 Ease.Linear 的方式用一秒的时间输出
运动序列的使用方法
让doTween中的动作一次执行,不像上述方法一样直接到达目标点
Sequence sequence = DOTween.Sequence();
sequence.Append(mText.DOText("你醒啦", 2f)); 0-2
sequence.Append(mText.DOText("", 0.5f)); 2-2.5
sequence.AppendInterval(1f); 2.5-3.5
sequence.Append(mText.DOText("我等你很久了", 2f)); 3.5-5
首先创建一个 Sequence (序列),然后给此序列 传递需要执行的函数,跟委托一样,接着队列会依次执行上传的方法,
sequence.Insert(float atPosition, Tween t);
尤其注意这个拆入方法, 第一个参数指的是插入的时间顺序,不是序列顺序.
以上述为例,如果参数是 (2,t) ,那么该序列会在队列执行到第二秒的时候插入一个 Tween 的动作,等这个动作执行完毕后,才会继续执行后面的动作,加入这个动作的持续时间为 1 秒,那么序列将会在,第2秒的时候插入一个时间为1秒的动作.
Join(Tween t)和 Append(Tween t)
类似,可以在任意地方插入想要的动作
Append 是队列形式存储, 先进先出,
Prepend 以栈形式存储,先进后出,后进先出,
Sequence se = DOTween.Sequence();
se.Append(transform.DOMove(Vector3.left, 2)); //左走 3
//se.Join(transform.DOScale(Vector3.one * 2, 1)); 4
se.AppendInterval(1f); //停止一秒 5
//se.Join(transform.DOScale(Vector3.one, 1)); 6
se.Append(transform.DOMove(Vector3.down, 2)); //下走 7
///se.Insert(1, transform.DOScale(Vector3.one * 2, 1));
///se.Insert(4, transform.DOScale(Vector3.one, 1));
se.Prepend(transform.DOMove(Vector3.up, 2)); 2
se.Prepend(transform.DOMove(Vector3.up, 2)); 1
将prepend加入到序列的最后面,则程序会从 prepend 1-> 2 开始,然后再从上往下执行,
回调函数的使用
可以让我们监督每一个行为是否完成
se.AppendCallback(CallBack2);
se.InsertCallback(2,CallBack1);
se.PrependCallback(callBack3);
注意Prepend 会在Prepend 的行为执行完之后再执行
DoTween支持链式编程,链式编程就是指可以对一个方法,反复的 进行 ,Function().Function1() .等等方法的编程
第一种循环方式
transform.DOMove(Vector3.one, 1f).SetLoops(3,LoopType.Incremental);
transform.DOMove(Vector3.one, 1f).SetLoops(3,LoopType.Incremental).SetEase(Ease.Linear);
SetLoops();第一个参数是循环的次数,参数为-1时,指无限循环,第二个参数为循环方式
looptype有三种方式:
- Incremental-递增,重复执行此行为
- Restart- 跟 Mathf.Repeat()一样,物体到达目标点之后,回到Local原点,再前往目标点,依次循环
- Yoyo顾名思义,悠悠球,跟Mathf.Pingpong()差不多,物体到达目标点后,从目标点出发,向Local原点前进,依次循环,需要注意的是,Yoyo如果不是无限循环的话,那么物体从原点到目标点,算一次循环,从目标点到原点,算一次循环,
第二种设置循环的方式
TweenParams tp = new TweenParams();
tp.SetLoops(3, LoopType.Restart);
transform.DOMove(Vector3.one, 2).SetAs(tp);
SetAutoKill() - 自动销毁此行为,节省内存资源,一般情况下,行为并不会被自动销毁
可以在某些只使用一次的行为上加上 SetAutoKill() 方法进行处理
transform.DOMove(Vector3.one, 1f).From(true);
From() - 将一个 To Tween 转变为一个 From Tween,将当前目标的位置设置为渐变的结束值,然后立即将目标发送到先前设置的结束值。
transform.DOMove(new Vector3(10, 10, 10), 1f);
//从当前位置到目标位置
transform.DOMove(new Vector3(10, 10, 10), 1f).From();
//从目标位置到当前位置
transform.DOMove(new Vector3(10, 10, 10), 1f).From(true);
//将当前位置加上目标位置,得到一个相对位置,从相对位置到当前位置
SetDelay() - 设置动画的延时时间 ,参数是时间
在动画运行过程中,也可以用速度来控制动画的播放,而不是基于时间播放动画
transform.DOMove(new Vector3(10, 10, 10), 1f).SetSpeedBased(true);
当SetSpeedBase(false),或者SetSpeedBase()的时候,1f 表示时间
当SetSpeedBase(true)的时候, 1f 表示速度
SetID(id) . 可以这个动画添加一个ID,可以是数值,也可以是字符串或者其它
需要使用这个动画的时候,
DOTween.Play(id);
SetRecyclable() 设置为可回收对象,当对象被销毁后,允许垃圾回收
SetRelative(true) 对象会进行增量运动,假设物体在 Vector3.one 的位置,目标点也是 Vector3.one ,则对象不会进行移动,
transform.DOMove(new Vector3(10, 10, 10), 1f).SetRelative(true);
则物体会进行增量运动, 移动到 (2,2,2)的位置
transform.DOMove(new Vector3(10, 10, 10), 1f).SetUpdate(UpdateType.Normal,true);
设置行为的帧类型,如果为True的话,那么dotween不受 Unity Time.Scale 影响
transform.GetComponent<MeshRenderer>().material.DOColor(Color.red, 2).SetEase(Ease.Flash, 10, 0);
设置运动曲线需要用SetEase方法,Flash ,是闪烁的效果,
SetEase参数分别为 曲线类型,振幅, 周期(-1,0,1)
Unity可以自定义运动曲线,
public AnimationCurve m_Ac;
transform.DOMove(new Vector3(10, 10, 10), 2).SetEase(m_Ac);
-
Dotween的回调
OnComplete() ,Tween完成后触发
OnKill() ,Tween被杀死后触发
OnPause() ,Tween被暂停后触发
OnPlay() ,Tween 暂停后,被Play后触发
OnStepComplete() 如有循环,则循环一次触发一次
OnRewind() 倒回,重置动画结束的时候触发
OnUpdate() 如想在动画执行的过程过同时执行另一个动画,
OnWaypointChange()
OnStart() ,动画开始时调用,不管循环多少次,只调用一次 -
控制函数的使用方法
transform.DORestart(); //让动画重新播放
transform.DORewind(); //让动画回到原点
transform.DOSmoothRewind(); //让动画平滑回到原点
transform.DOPlay(); //让所有动画播放
transform.DOPlayBackwards();//让动画回放
transform.DOPlayForward(); //让动画前放
transform.DOFlip(); //让动画翻转,起点变目标点,目标点变原点
transform.DOGoto(1, false); //第一个参数表示跳转的时间点,第二个参数表示是否播放动画
transform.DOTogglePause(); // 跟开关一个意思
- 类方法介绍
DOTween.PausedTweens(); 返回所有暂停的动画,没有则返回null
DOTween.PlayingTweens(); 返回所有正在播放的动画,没有则返回null
DOTween.TweensById(“id”, true); 返回正在True播放状态的ID的动画
DOTween.TweensByTarget(transform, true); 返回正在播放的某个对象(Transform ,Material . . .)的动画
DOTween.IsTweening(transform); 返回一个bool值,判断某个对象是否正在执行
DOTween.TotalPlayingTweens(); 统计正在播放的动画,延时的也算
Tween t = transform.DOMove(new Vector3(10, 10, 10), 5);
t.fullPosition = 3;
fullPosition 属性,表示动画的执行时间,可以修改与读取,修改之后,动画将直接跳跃到修改后的数值
tween.Delay(); 获取当前动画的延迟时间
tween.Duration(bool b) ,获取动画的持续时间,b 为true 时,包含循环时间,返回 (次数 * 时间)
false时不包含循环,返回具体的动画执行时间 , 返回 (时间)
tweener.Elapsed(bool b) 返回动画完成的时间 ,也有一个是否包含循环的bool值
tweener.ElapsedDirectionalPercentage() 返回动画进度的百分比,不包含循环,只使用一次
tweener.ElapsedPercentage(bool b) ,带参数,表示是否包含循环
还有一些判断状态的方法 isAcrive,isPlaying 等等
DoTween 跟 Unity 的协程进行合作,可以进行回调的操作,比如
yield return tween.WaitForCompletion(); //等待动画全部完成之后
yield return tween.WaitForElapsedLoops(2); //等待动画循环两次之后
yield return tween.WaitForKill(); //等到动画被杀死之后
yield return tween.WaitForPosition(1); //等待动画播放1秒之后
yield return tween.WaitForRewind(); //等待动画重置之后
yield return tween.WaitForStart(); //等待动画开始之后
DoTween 里面所有 position 指的都是时间对象,不是具体的坐标值