太棒了。Dotween常用方法詳解(借鑑大神,僅作爲筆記用)

一、Unity常用組件拓展方法

(1) Transform拓展方法

1)Position

1)改變世界座標
移動方法,第一個參數是要移動到的目標點,不是移動這個向量的距離
transform.DOMove(new Vector3(1, 1, 1), 2);
只控制x軸上的移動,其他兩個方向同理
transform.DOMoveX(1, 2);

2)改變局部座標
transform.DOLocalMove(new Vector3(1, 1, 1), 2);
transform.DOLocalMoveX(1, 2);

2)Rotation
1)世界旋轉
旋轉到給定的值,改變的是歐拉角
transform.DORotate(new Vector3(0, 90, 0), 2);
旋轉到給定的值,改變的是四元數
transform.DORotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);

2)局部旋轉
旋轉到給定的值,改變的是歐拉角
transform.DOLocalRotate(new Vector3(0, 90, 0), 2);
旋轉到給定的值,改變的是四元數
transform.DOLocalRotateQuaternion(new Quaternion(0.1f, 0.1f, 0.1f, 0.1f), 2);

在給定時間內,平滑的讓自身的z軸正方向指向目標點
transform.DOLookAt(new Vector3(0, 0, 0), 2);

3) Scale
同上面一樣,這裏改變物體的縮放到目標值
transform.DOScale(new Vector3(2, 2, 2), 2);
其他兩個軸向同理
transform.DOScaleX(3, 2);

4) Punch
第一個參數 punch:表示方向及強度
第二個參數 duration:表示動畫持續時間
第三個參數 vibrato:震動次數
第四個參數 elascity: 這個值是0到1的
當爲0時,就是在起始點到目標點之間運動
不爲0時,會把你賦的值乘上一個參數,作爲你運動方向反方向的點,物體在這個點和目標點之間運動
transform.DOPunchPosition(new Vector3(0, 1, 0), 2, 2, 0.1f);
transform.DOPunchRotation(new Vector3(0, 90, 0), 2, 2, 0.1f);
transform.DOPunchScale(new Vector3(2, 2, 2), 2, 2, 0.1f);

以position爲例,elascity的取值是 0 到 1 的
elascity爲0時,物體就在起始點和目標點之間運動
elascity不爲0時,會自動計算,產生一個反向點,數值越大方向點離的越遠

5)Shake
參數:持續時間,力量,震動,隨機性,淡出
力量:實際就是震動的幅度,可以理解成相機施加的力的大小 使用Vector3可以選擇每個軸向不同的強度
震動:震動次數
隨機性:改變震動方向的隨機值(大小:0~180)
淡出:就是運動最後是否緩慢移動回到原本位置
transform.DOShakePosition(1, 5, 10, 50, true);
transform.DOShakeRotation(3);
transform.DOShakeScale(3);

6)Blend
帶Blend名稱的方法,允許混合動畫
原本同時執行兩個Move方法,只會執行最新的一個動畫命令
例如:
transform.DOMove(Vector3.one, 2);
transform.DOMove(Vector3.one * 2, 2);
結果是物體運動到了(2,2,2)座標上

DOBlendableMoveBy方法有兩個特點
1)允許多個同時執行
例如:
transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);
transform.DOBlendableMoveBy(new Vector3(-1, 0, 0), 1);
假設其實點爲(0,0,0),最後動畫停止時的座標就是(0,1,1)
2)它是增量動畫
transform.DOBlendableMoveBy(new Vector3(1, 1, 1), 1);
假設其實點爲(1,1,1),最後動畫停止時的座標就是(2,2,2)
它的參數不是目標點,而是要移動的量

以下三個函數同理
transform.DOBlendableRotateBy()
transform.DOBlendableScaleBy()
transform.DOBlendablePunchRotation()

(2) Camera拓展方法
1)調整屏幕視角的寬高比 第一個參數是寬高的比值
camera.DOAspect(0.6f, 2);

2)改變相機background參數的顏色
camera.DOColor(Color.blue, 2);

3)改變相機近切面的值
camera.DONearClipPlane(200, 2);

4)改變相機遠切面的值
camera.DOFarClipPlane(2000, 2);

5)改變相機FOV的值
camera.DOFieldOfView(30, 2);

6)改變相機正交大小
camera.DOOrthoSize(10, 2);

7)按照屏幕像素計算的顯示範圍
camera.DOPixelRect(new Rect(0f, 0f, 600f, 500f), 2);

8)按照屏幕百分比計算的顯示範圍
camera.DORect(new Rect(0.5f, 0.5f, 0.5f, 0.5f), 2);

9)相機震動
相機震動效果 參數:持續時間,力量,震動,隨機性,淡出
力量:實際就是震動的幅度,可以理解成相機施加的力的大小 使用Vector3可以選擇每個軸向不同的強度
震動:震動次數
隨機性:改變震動方向的隨機值(大小:0~180)
淡出:就是運動最後是否緩慢移動回到原本位置
camera.DOShakePosition(1, 10, 10, 50, false);

(3) Material拓展方法
1)改變顏色
material.DOColor(Color.black, 2);

2)按照shader的屬性名,修改顏色
material.DOColor(Color.clear, "_Color", 2);

3)修改alpha值
material.DOFade(0, 2);

4)顏色漸變
Gradient是unity的漸變編輯器(下面有漸變編輯器的圖)
material.DOGradientColor(Gradient, "_Color", 3);

5)改變材質offset的值
material.DOOffset(new Vector2(1, 1), 2);

6)改變提供的shader屬性的名稱對應的Vector4值
material.DOVector(new Vector4(0, 0, 0, 1), "_Color", 3);

7)顏色混合
跟位置混合動畫同理,可以同時執行而不干擾,產生混合在一起的顏色
material.DOBlendableColor(Color.red, "_Color", 3);
漸變編輯器

(4) Text拓展方法
頭三個都是常規方法,不多介紹了
text.DOColor(Color.black, 2);
text.DOFade(0, 2);
text.DOBlendableColor(Color.black, 2);

這個方法比較有意思
是把第一個參數傳入的內容按照時間,一個字一個字的輸入到文本框中
text.DOText("context", 2);

二、Dotween常用方法
(1) Sequence
Sequence quence = DOTween.Sequence();

1)添加動畫到隊列中
quence.Append(transform.DOMove(Vector3.one, 2));

2)添加時間間隔
quence.AppendInterval(1);

3)按時間點插入動畫
第一個參數爲時間,此方法把動畫插入到規定的時間點
以這句話爲例,它把DORotate動畫添加到此隊列的0秒時執行,雖然它不是最先添加進隊列的
quence.Insert(0, transform.DORotate(new Vector3(0, 90, 0), 1));

4)加入當前動畫
Join會加入和讓動畫與當前正在執行的動畫一起執行
如下兩行代碼,DOMove會和DOScale一起執行
quence.Append(transform.DOScale(new Vector3(2, 2, 2), 2));
quence.Join(transform.DOMove(Vector3.zero, 2));

5)預添加動畫
預添加 會直接添加動畫到Append的前面,也就是最開始的時候
quence.Prepend(transform.DOScale(Vector3.one * 0.5f, 1));
這裏需要特別說一下預添加的執行順序問題
它這裏也採取了隊列的性質,不過,預添加與原本的的隊列相比是一個反向隊列
例如:
Sequence quence = DOTween.Sequence();
quence.Append(transform.DOMove(Vector3.one, 2));
quence.Prepend(transform.DOMove(-Vector3.one*2, 2));
quence.PrependInterval(1);
執行順序是 PrependInterval----Prepend-----Append
就是最後添加的會在隊列的最頂端

6)預添加時間間隔
quence.PrependInterval(1);

回調函數

1)預添加回調
quence.PrependCallback(PreCallBack);

2)在規定的時間點加入回調
quence.InsertCallback(0, InsertCallBack);

3)添加回調
quence.AppendCallback(CallBack);

(2) Tweener的設置
TweenParams para = new TweenParams();

1)設置動畫循環 
第一個參數是循環次數 -1代表無限循環
第二個參數是循環方式 
Restart 重新開始 
Yoyo 從起始點運動到目標點,再從目標點運動回來,這樣循環 
Incremental 一直向着運動方向運動
para.SetLoops(-1, LoopType.Yoyo);

2)設置參數
transform.DOMove(Vector3.one, 2).SetAs(para);

3)設置自動殺死動畫
transform.DOMove(Vector3.one, 1).SetAutoKill(true);

4)from補間
例如;
transform.DOMove(Vector3.one, 2).From(true);
From參數 isRelative(相對的):
爲true,傳入的就是偏移量,即當前座標 + 傳入值 = 目標值
爲falese,傳入的就是目標值,即傳入值 = 目標值

5)設置動畫延時 
transform.DOMove(Vector3.one, 2).SetDelay(1);

6)設置動畫運動以速度爲基準
例如:
transform.DOMove(Vector3.one, 1).SetSpeedBased();
使用SetSpeedBased時,移動方式就變成以速度爲基準
原本表示持續時間的第二個參數,就變成表示速度的參數,每秒移動的單位數

7)設置動畫ID
transform.DOMove(Vector3.one, 2).SetId("Id");

8)設置是否可回收
爲true的話,動畫播放完會被回收,緩存下來,不然播完就直接銷燬
transform.DOMove(Vector3.one, 2).SetRecyclable(true);

9)設置動畫爲增量運動
例如:
transform.DOMove(Vector3.one, 2).SetRelative(true);
SetRelative參數 isRelative(相對的):
爲true,傳入的就是偏移量,即當前座標 + 傳入值 = 目標值
爲falese,傳入的就是目標值,即傳入值 = 目標值

10)設置動畫的幀函數
例如:
transform.DOMove(Vector3.one, 2).SetUpdate(UpdateType.Normal, true);
第一個參數 UpdateType :選擇使用的幀函數
UpdateType.Normal:更新每一幀中更新要求。 
UpdateType.Late:在LateUpdate調用期間更新每一幀。 
UpdateType.Fixed:使用FixedUpdate調用進行更新。 
UpdateType.Manual:通過手動DOTween.ManualUpdate調用進行更新。
第二個參數:爲TRUE,則補間將忽略Unity的Time.timeScale


(3) Ease 運動曲線的設置
1)以Ease枚舉作爲參數
例如:
transform.DOMove(Vector3.one, 2).SetEase(Ease.Flash, 3, 0f);
第二個參數 Amplitude(振幅):實際就是移動次數,起始點移動到目標算移動一次,再移動回來移動兩次
第三個參數 period 值的範圍是 - 1~1
值 > 0時,爲活動範圍的衰減值,活動範圍會由大變小
值 = 0時,就是均勻的在起始座標和目標座標之間運動
值 < 0時,會施加一個向目標座標的一個力,活動範圍一點點增大,最後逼近目標點
這兩個參數只對Flash, InFlash, OutFlash, InOutFlash這四種曲線有用,其他的曲線起作用的就只有Ease枚舉參數

2)使用AnimationCurve當作參數
例如:
transform.DOMove(Vector3.one * 2, 1).SetEase(curve);
AnimationCurve 橫軸是時間,不過不是具體的時間,而是時間比例
AnimationCurve 縱軸是倍數
假設縱軸的值爲v,傳入DOMove的第一個參數endValue是e,起始點座標是s
此物體最後動畫結束時的實際座標即爲 v* (e -s)+ s

3)以回調函數爲參數
例如:
transform.DOMove(Vector3.one * 2, 1).SetEase(MyEaseFun);

//返回值是運動距離的百分比 值應爲0~1之間,最後的值需爲1,不然停留的位置不會是目標位置
private float MyEaseFun(float time, float duration, float overshootOrAmplitude, float period)
{
return time / duration;
}

(4) 回調函數
1)動畫完成回調
transform.DOMove(Vector3.one, 2).OnComplete(() => { });

2)動畫被殺死時回調
transform.DOMove(Vector3.one, 2).OnKill(() => { });

3)動畫播放時回調,暫停後重新播放也會調用
transform.DOMove(Vector3.one, 3).OnPlay(() => { });

4)動畫暫停時回調
transform.DOMove(Vector3.one, 2).OnPause(() => { });

5)動畫回退時回調
以下情況會被調用
使用DORestart重新播放時
使用Rewind倒播動畫完成時
使用DOFlip翻轉動畫完成時
使用DOPlayBackwards反向播放動畫完成時
transform.DOMove(Vector3.one, 2).OnRewind(() => { });

6)只在第一次播放動畫時調用,在play之前調用
transform.DOMove(Vector3.one, 2).OnStart(() => { });

7)完成單個循環週期時觸發
transform.DOMove(Vector3.one, 2).OnStepComplete(() => { });
8)幀回調
transform.DOMove(Vector3.one, 2).OnUpdate(() => { });

9)在路徑動畫時,改變目標點時的回調,參數爲當前目標點的下標
transform.DOMove(Vector3.one, 2).OnWaypointChange((value) => { });

(5) 動畫控制方法
1)播放
transform.DOPlay();

2)暫停
transform.DOPause();

3)重播
transform.DORestart();

4)倒播,此方法會直接退回起始點
transform.DORewind();

5)平滑倒播,此方法會按照之前的運動方式從當前位置退回起始點
transform.DOSmoothRewind();

6)殺死動畫
transform.DOKill();

7)翻轉補間的方向
transform.DOFlip();

8)跳轉時間點
第一個參數跳轉的時間點,第二個參數是跳轉後是否播放動畫
transform.DOGoto(1.5f, true);

9)反向播放動畫
反向播放動畫,在動畫播放到一半時執行,會退回起始點,在一開始執行看不到效果是因爲,物體本身就在起始點
transform.DOPlayBackwards();

10)正向播放動畫
正向播放動畫
transform.DOPlayForward();

11)TogglePause
當暫停時,執行就繼續播放,播放時,執行就暫停
transform.DOTogglePause();

(6) 獲取數據方法
一、類方法
1)返回所有暫停的動畫,沒有則返回null
DOTween.PausedTweens();

2)返回所有真正播放的動畫,沒有則返回null
DOTween.PlayingTweens();

3)獲取給定ID的數組
例如:
DOTween.TweensById("id", true);
返回滿足條件的動畫數組
第一個參數是動畫的ID
第二個參數是是否只收集正在播放的動畫

4)返回給定對象的數組
例如:
DOTween.TweensByTarget(transform, true);
返回滿足條件的動畫數組
第一個參數是播放動畫的對象
例如:transform.DOMove(Vector3.one, 2); 第一個參數就傳入transform
material.DOColor(Color.White, 2); 第一個參數就傳入材質對象material
第二個參數是是否只收集正在播放的動畫

5)收集傳入的對象是否有動畫在活動
例如:
DOTween.IsTweening(transform);
第一個參數爲檢測的對象
第二個參數爲是否檢測動畫在播放狀態
爲true時,給定對象在播放狀態時 返回true
爲false時,只檢測給定對象是否有動畫(在pause狀態時也算)有則返回true

6)正在播放的動畫的總數,目前處於延遲播放狀態的動畫也算
DOTween.TotalPlayingTweens();

二、實例方法
_tweener = transform.DOMove(Vector3.one, 2)

1)表示動畫執行時間的屬性,可讀可寫
_tweener.fullPosition = 1;

2)表示動畫執行完的次數
_tweener.CompletedLoops()

3)獲取動畫的延遲時間
_tweener.Delay();

4)獲取動畫的持續時間
參數爲true 表示計算循環的時間,無限循環爲Infinity
_tweener.Duration(false)

5)動畫已播放的時間
參數爲true 表示計算循環的時間
_tweener.Elapsed()

6)返回動畫進度的百分比
起始點爲0 目標點爲1 當yoyo循環模式下,值會從0變到1再從1變到0
_tweener.ElapsedDirectionalPercentage()

7)返回動畫區間已用的百分比
單次循環的數值爲0到1
參數爲 是否包含循環 爲true時 返回值是循環總區間的已用百分比 若爲無限循環 返回值爲0
_tweener.ElapsedPercentage(true)

8)動畫是否在活動
_tweener.IsActive();

9)是否是反向動畫
_tweener.IsBackwards();

10)動畫是否完成
_tweener.IsComplete();

11)是否以初始化
_tweener.IsInitialized();

12)是否正在播放
_tweener.IsPlaying();

13)返回循環次數, 無限循環爲Infinity
_tweener.Loops();

(7) 攜程方法
private IEnumerator Wait()
{
_tweener = transform.DOMove(Vector3.one, 2);

1)等待動畫執行完
yield return _tweener.WaitForCompletion();

2)等待指定的循環次數
參數爲執行次數,等待傳入的循環次數後,繼續執行
若是傳入的次數大於動畫的循環次數 則在動畫結束時繼續執行
yield return _tweener.WaitForElapsedLoops(2);

3)等待動畫被殺死
yield return _tweener.WaitForKill();

4)等待動畫執行指定時間
參數爲時間,動畫執行傳入的時間之後或動畫執行完畢,繼續執行
yield return _tweener.WaitForPosition(0.5f);

5)等待動畫回退
以下情況會繼續執行函數
使用DORestart重新播放時
使用Rewind倒播動畫完成時
使用DOFlip翻轉動畫完成時
使用DOPlayBackwards反向播放動畫完成時
yield return _tweener.WaitForRewind();

6)等待Start執行後繼續執行
yield return _tweener.WaitForStart();
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章