using DG.Tweening;
Tweener
首先dotween在游戏刚开始运行时会默认进行一次初始化
DOTween.Init();
如果为了有更好的效率,可以手动控制最大同时进行dotween动作的执行数量,
DOTween.Init(true,true,LogBehavior,Verbose).SetCapacity(200,10); //200个是tween补间动作,10是squence
有三种方式创建tweener动作
1: DOTween.To(getter,setter,to,float duration)
getter, 数值补间动作返回值 setter,数值补间动作的设置值, to 是目标的数值, duration是补间动作的时长
getter,和setter的变量一致, 利用lambda表达式来设置
()=>变量A ; x=>变量A=x
如: float myFloat; //定义一个float
void Start()
{
DOTween.To(()=>myFloat, x=>myFloat=x, 10f,1f); //让myfloat在一秒内,从myfloat当前值过度到10;
}
DOTween.To(setter,from, to,float duration) //另一种写的方法, 只写setter,定义 数值的开始和结束值
如
void Start()
{
DOTween.To(x=>myFloat=x, -10f,10f,1f); //让myfloat在一秒内,从-10过度到10;
}
此外还有DOTween.Punch(); //摇晃数值到初始值
//方法原型
public static TweenerCore<Vector3, Vector3[], Vector3ArrayOptions> Punch(DOGetter<Vector3> getter, DOSetter<Vector3> setter, Vector3 direction, float duration, int vibrato = 10, float elasticity = 1);
//参数1:getter 参数2:setter 参数3:enPos 参数4:duration时间 参数4:晃动的次数 参数5:晃动的幅度
DOTween.Punch(() => myValue, x => myValue = x, new Vector3(100, 100, 100), 3,1,100); DOTween.shake(); //颤抖数值
DOTween.ToArray() //数值集合间过度
如
Vector3[] endValues = new[] { new Vector3(1,0,1), new Vector3(2,0,2), new Vector3(1,4,1) };
float[] durations = new[] { 1, 1, 1 };
DOTween.ToArray(()=> myVector, x=> myVector = x, endValues, durations);
DOTween.ToAlpha() 颜色alpha过度
DOTween.ToAxis(); 过度变换 vector3中的某一轴数值
如:
DOTween.ToAxis(()=> myVector, x=> myVector = x, 3, 1); //始终变换x轴的数值到3,在一秒内
DOTween.ToAxis(()=> myVector, x=> myVector = x, 3, 1, AxisConstraint.Y); //1秒内变换myVector 到(myVector.x,3,myVector.z)
2: 组件后缀形式 (特点是前缀加DO :DOMove ,DOScale)
tranform.DOMove(targetVector3, durationTime, isSnap); //这是从当前位置值移动到目标值
tranform.DOMove(targetVector3, durationTime, isSnap).From(); //这是从targetVector3
值作为起点,移动到当前位置值
tranform.DoMove和rigidBody.DoMove. 功能相同;都是移动到目标距离
3 :针对不同组件的属性数值有对应的dotween补间动作值
如:audiosource.DOFade(targetVolume,durationTime);//是将声音值过度到对应值
sequence
就像动画编辑器一样,在时间轴上布置dotween 动作
布置动作的API有 Append (tweener) AppendCallBack(方法)
AppendInterval(间隔时间)序列结尾增加间隔时间
以及PreAppend(tweener) 开头位置 插入 一个tweener
PreAppendInterval (time) 开头位置插入一个空隙时间
Insert(插入时间,tweener) 无视序列顺序, 同步进行
InsertCallBack();
sequence的总时间 sequence.Duration();
如 void Start()
{
Sequence mySequence=DOTween.Sequece(); //定义一个sequence
mySequence.Append(transform.DoMoveX(3f,1f)); //x轴一秒内移动到3
mySequence.AppendInterval(2f); //延迟2秒
mySequence.AppendCallback(()=>Debug.log("2秒后..")); //两秒后调用一个回调函数
mySequence.PreAppend(tranform.DoScale((5f,5f,5f),1f)); //开头插入1秒内一个缩放到(5,5,5)的补间动作
mySequence.PreAppendInterval(1f);//序列开头插入1秒的等待时间
mySequence.Insert( 2f, Renderer.Material.DoColor(Color.Green,5f) ); //在序列第二秒插入一个并行的补间动作: 5秒内材质变换成绿色;
}
Chained Setting 代码链式设置 tweener后可以跟随无限个以下方法
如: myTweener.SetEase().SetRelative(true).OnComplete()......;
Tweener.SetAs(tweener); 复制设置数值到新的tweener
.SetAutoKill(false) 结束时禁止销毁 适用于经常使用的情况
.SetEase(Ease.Liner) 过度方式
.SetLoop(int 次数,LoopType)
.SetRecycle() 重复利用 不同于SetAutoKill,它会被其他tweener发起者调用
.SetRelative(); 相对数值,结束值变成了开始值+结束值 如(1,1f) 移动到1,relative为true后 变成 移动当前数值+1
.SetUpdate(UpdateType, bool isIndenpendant); update模式, 以及是否受unityENgine的timescale影响 默认false 受影响 尽量不用 fixed 一旦 timescale为0,就没有补间动画
Chained Callbacks
.OnComplete(方法) 补间动画结束调用方法
.OnKill()
.OnPlay()
.OnPause()
.Rewind()
.OnStart()
.OnUpdate()
OnWayPointChange()
.OnStep();
特殊后缀
.From(bool isRelative) isRelative 真时, 起始位置为 endPos +StartPos
.SetDelay()
.SetSpeedBased 速度 需要 SetEasy.liner
字幕的渐显效果
string zimu;
DOTween.TO(()=>zimu,x=>zimu=x, "要显示的台词",durationTime).setOption(true,scrambleMode) ; //是否使用richtext,以及混乱变换字符
把补间动作设置内容保存成对象, 用setAs(),来调用,方便全局调试
TweenParams tParms = new TweenParams().SetLoops(-1).SetEase(Ease.OutElastic);
// Apply them to a couple of tweens
transformA.DOMoveX(15, 1).SetAs(tParms);
transformB.DOMoveY(10, 1).SetAs(tParms);
控制补间动画
1
DOTween.pauseAll(); //停止所有补间动画
DOTween.Pause(id) ;//停止制定id的补间动画 id设置 tweener.SetId(object);
DoTWeen.Pause(组件) //停止组件上的所有补间动画
2
tweener.Pause();
3
myTransform.DOPause(); //组件快捷方式前缀加DO
所有控制补间动画的API (组件后缀名称前缀加DO) 如DOTween.Pause(id) myTransform.DOPause();
Complete/ALL //立即播放到结尾
Flip/All //反转播放顺序
Play/All
Pause/all
PlayForward/All
PlayBackward/all
Goto/all //在某处时间播放
Kill/all //立即销毁tweener ,即使setAutoKill(false)
Restart//all
Rewind/all //和restart 区别是 rewind起始位置不播放
TogglePause/all //play和pause状态间切换
根据状态获得tweener
DOTween.PausedTweens(); //获得所有暂停的tweener
DOTween.PlayingTweens();
DOTween.TweenById(object id, bool playingOnly=false);
DOTween.TweenByTarget(object target,bool playingOnly=false) //根据组件获得其tweener
DOTween.IsTweening(object idor Target) :bool //目标是否tweening
DOTween.TotalPalyingTweens():int //全部正在播放的tweener个数
tweener实例的状态
myTweener.fullPosition //全部播放的时间 包括循环和延迟
myTweener.completedLoops //以及循环的次数
myTweener.Delay(); //获得延迟的时间 myTweener.SetDelay(2f) 是指延迟的时间
myTweener.Elapsed(bool includeLoops=true); //已经播放过的时间
.ElapsedPercentage();
myTweener.Duration(bool includeLoops=true); //补间动画的时长,不包括延迟的时间
myTweener.IsActive();
myTweener.IsBackWard();
myTweener.IsComplete()
myTweener.IsPlaying()
myTweener.loops();
异步协程
yield return myTween.WaitForCompletion(); //等待tweener结束
yield return myTween.WaitForElapsedLoops(2) //等待两次循环后
WaitForKill() //等待销毁后
waitForPosition(0.5f) //等待时间位置在0.5秒后
waitForRewind //等待重播
waitForStart() //等待开始 有延迟的情况
改变tweener的动画起始和结束值
tweener.ChangeEndValue(newEndValue,float duration=-1,bool keepStartValue) //keepStartValue 为真时,当前值设为开始值 ,duration值大于0,则重设补间时间
tweener.ChangeStartValue(newStartValue,float duration=-1)
tweener.ChangeValue(newStartValue,newEndValue,float duration=-1);
DOTVirtual 实用的方法
DOTVirtual.Float(float from,float to,float durationTime, Callback);
DOTVirtual.Float(-10f,10f,1f,x=>Debug.log(x)); //一秒内从-10到10, 并每帧打印当前过度值
DOTVitual.DelayedCall(float delayTime, Callback, bool isIgoreTimeScale=true)
DOTVitual.DelayedCall(1f,()=>Debug.log("1秒后")); //延迟一秒后调用指定回调函数