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秒后")); //延遲一秒后調用指定回調函數