前言
本篇文章主要介紹 Unity 遊戲開發中 DoTween 動畫插件的【安裝】與【使用教學】,並額外提供了一些補充說明。希望能幫助大家更好地理解這些工具的使用方法,提升遊戲開發效率,也歡迎大家支持原文作者!
DOTween 插件介紹
DOTween 是由 Unity 開發者 Demigiant 提供的高性能、開源動畫插件,專為 Unity 引擎設計,透過流暢的 API、鏈式調用和非同步設計,簡化動畫創建與控制,讓開發者輕鬆實現動態運動並靈活安排動畫順序與播放時機,也可以透過事件監聽或協程 (Coroutine) 來準確的安排動畫的順序與播放時機。
常見用途
- 角色動畫:DoTween 可以用來輔助控制角色的動作,比如【跳躍】、【奔跑】等。
- UI 動畫:DoTween 被廣泛用於處理 UI 動畫效果,如【按鈕的縮放】、【視窗的彈出和關閉】。
- 攝影機移動:可以用於控制攝影機的【運鏡效果】,讓場景切換變得更有動感。
實際應用場景
- 場景過渡動畫:DoTween 常用於控制場景中【物體的淡入淡出】,或者【攝影機的移動運鏡】,創造更流暢的過渡效果,增強玩家的視覺體驗。
- 數值動畫:在一些 UI 中,比如顯示分數或金幣的界面,DoTween 可以用來創建【數字滾動】的動畫效果,給玩家帶來更直觀的視覺反饋。
- 動畫同步:利用 DoTween 的鏈式語法,可以讓多個動畫效果同步進行,例如一個按鈕的【縮放】和【顏色變化】同時進行,簡化代碼結構,減少了錯誤發生的機會。
安裝 DOTween
首先前往 DOTween Download 網頁,點擊 Download DOTween 按鈕來下載最新版本的 DOTween 套件(本文以版本 1.2.765 為例)。
使用 7-Zip 打開 DOTween_1_2_765.zip 壓縮檔,然後開啟 Unity 專案,將 7-Zip 中的 DOTween 資料夾直接拖曳到 Unity 的 Asset 資料夾中。
導入和設定
DOTween 第一次使用需要設置,導入以後會彈出下面的窗口,點擊按鈕就好。
之後點選綠色的「Setup DOTween」按鈕就能設定。下面的綠色的按鈕是產生一個 ASMDEF 文件,讓寫腳本的時候不必每次都去編碼 DOTween 的內容,提高寫完程式碼切換的速度。
這個視窗可以透過選單 Tools/Demigiant/DOTween Utility Panel 再次打開,要訪問官網查看文件通過這裡都很方便。
點擊了按鈕就顯示這個介面,預設全選就好,再選 Apply 按鈕就可以了。
生成 DOTween 程序集
先點擊工具,找到 DoTween Utility Panel 並按下。
然後等待編譯通過,會在資料夾下自動產生程序集 [DOTween.Modules.asmdef]。
DoTween 使用教學
使用前需要新增引用命名空間
using DG.Tweening;
基本寫法有兩種
1、通用方法
DOTween.開頭的官方叫通用方法,其中最常用的就是 DOTween.To(getter, setter, to, float duration)。絕大多數動畫都可以用這個方法解決。前2個輸入的是代理。無論是控制移動,旋轉,顏色變化,文字變化都可以用這個方法。 getter 是初始值,setter 是變化的值,to 是目標,duration 是變化時長。
DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1);
DOTween.To(()=> 0, x=> myFloat = x, 50, 5);
DOTween.To(() => 0, AddChar, message.Length, message.Length * duration);
2、便捷方法
便捷方法是 Unity 的各種屬性 .DOXXX,簡單說就是能少打幾個字。例如讓目前遊戲物件移動到某個位置的 DOMove。
transform.DOMove(Vector3.right * 3, 2);
不同屬性後面可以 DO 出不同的動作,而且參數不同。一般常見的動畫變化都有,推薦看一下官方文件有個大概印象,使用的時候,遇到對應屬性的動畫的時候,DO 出來再靠代碼提示來選擇就好。
添加設定
主要的語句完了以後,可以通過點,點出更多的設定跟在後面,如常見的循環。
transform.DOMove(Vector3.right * 8, 2).SetLoops(3, LoopType.Yoyo);
DoTween 事件回應
對於動畫的事件回應也是點出來跟在後面的。
transform.DOMove(Vector3.right * 8, 2).OnComplete(OnEnd);
transform.DOMove(Vector3.right * 8, 2).OnComplete(() => Debug.Log("Text Complete!"));
1.在動畫播放完成時執行特定的邏輯-OnComplete
transform.DOMove(Vector3.right * 8, 2).OnComplete(() => {
Debug.Log("Text Complete!")
});
2、在動畫被殺死時執行特定的邏輯-OnKill
transform.DOMove(new Vector3(0, 0, 0), 1f).OnKill(() => {
Debug.Log("動畫被終止了!");
// 這裡可以添加你的清理代碼
});
DoTween 動畫衝突的一些解決方案
1、清除所有正在進行的動畫-DOTween.Clear
- DOTween.Clear(true)
- 清除所有正在進行的動畫,並且會立即停止並釋放這些動畫的資源。
- 所有的動畫結束時,會調用它們的
OnKill
回調(如果有的話),這意味著你可以在這裡進行一些清理工作。
- DOTween.Clear(false)
- 清除所有正在進行的動畫,但不會立即停止它們。
- 這些動畫會繼續執行,直到它們自然結束或被其他方式中止。該方法不會呼叫
OnKill
回調。
2、完成所有正在進行的動畫-DOTween.CompleteAll
- DOTween.CompleteAll(true)
- 完成所有正在進行的動畫,並立即將它們的狀態設為「完成」。
- 所有動畫的 OnComplete 回調(如果有的話)會被呼叫。這意味著你可以在這些回調中執行一些操作,例如清理資源或觸發其他邏輯。
- DOTween.CompleteAll(false)
- 完成所有正在進行的動畫,但不會呼叫它們的 OnComplete 回調。
- 動畫會立即結束,但相應的完成功能(如回呼)不會被執行。
3、殺死所有正在進行的動畫-DOTween.KillAll
- DOTween.KillAll(true)
- 殺死所有正在進行的動畫,並且會立即釋放它們的資源。
- 所有被殺死的動畫的 OnKill 回調(如果有的話)將會被調用。這使得你可以在這些回調中執行清理操作,例如移除事件監聽器或釋放其他資源。
- DOTween.KillAll(false)
- 殺死所有正在進行的動畫,但不會立即釋放它們的資源。
- 被殺死的動畫不會呼叫 OnKill 回調。這意味著你不會得到任何關於這些動畫被殺死的通知,適用於不需要回調處理的情況。
DoTween 的一些常用用法
移動動畫
// 使得物體移動,第一個參數類型是Vector3,代表物體要移動到的世界坐標,第二個參數是移動到該位置所需要的時間
transform.DOMove(new Vector3(5, 9, 1), 6);
// 使得物體在x軸進行移動,第一個參數是移動到的x的位置,以自身坐標
transform.DOLocalMoveX(9, 7);
// blend會對物體的運動進行一個累加,第一個參數,需要累加的數,第二個參數是所需要的時間
transform.DOBlendableMoveBy(Vector3.one, 2);
// 使得物體到達參數一的位置就進行往返運動,
// 第一個參數是所能到達的位置
// 第二個參數是所需要的時間
// 第三個參數是往返的次數
// 第四個參數是值越大,反方向給的力就越大
transform.DOPunchPosition(new Vector3(0, 5, 0), 5, 2, 0.5f);
旋轉
模式
RotateMode.Fast // 旋轉不超過360度
RotateMode.FastBeyond360 // 旋轉超過360度
RotateMode.WorldAxisAdd // 旋轉將按照世界坐標系的軸進行旋轉
RotateMode.LocalAxisAdd // 按局部坐標軸進行增量旋轉
例子
// 使得物體進行旋轉,第一個參數是要達到的最終值,第二個是漸變的持續時間
transform.DORotate(new Vector3(5, 9, 1), 4);
// 參數1:旋轉到的角度 參數2:動畫的時間 參數3:旋轉的模式
transform.DORotate(new Vector3(0, 360, 0), 10f, RotateMode.WorldAxisAdd);
// 使物體一直旋轉
transform.DORotate(new Vector3(0, 180, 0), 1f, RotateMode.Fast).SetLoops(-1, LoopType.Restart);
// 使得物體進行旋轉,以自身為坐標軸,第一個參數是要達到的最終值,第二個是漸變的持續時間
transform.DOLocalRotate(new Vector3(4, 8, 9), 4);
// 使得物體進行旋轉,以世界坐標系,第一個參數是四元數,第二個是所需要的時間的值
transform.DORotateQuaternion(Quaternion.Euler(40, 8, 5), 7);
讓遊戲物件以線性速度不斷的繞著Z軸逆時針旋轉360度,並且循環播放此旋轉動畫。
- transform.DORotate(new Vector3(0, 0, -360), 2f, RotateMode.FastBeyond360):這部分程式碼使用 DOTween 庫的 DORotate 方法來實現旋轉動畫。 DORotate 方法接受三個參數:旋轉的目標角度(這裡是 new Vector3(0, 0, -360)表示繞著Z軸逆時針旋轉 360 度),持續時間(2 秒),以及旋轉模式(RotateMode.FastBeyond360 表示快速旋轉超過 360 度)。這意味著物件將會以較快的速度旋轉超過 360 度,而不是簡單地從起始角度旋轉到目標角度。
- .SetEase(Ease.Linear):這部分程式碼使用了 .SetEase 方法來設定緩動類型。在這裡,緩動類型被設定為 Ease.Linear,表示旋轉動畫將以線性速度進行,即勻速運動。
- .SetLoops(-1, LoopType.Restart):最後,使用 .SetLoops 方法設定動畫的循環次數和循環類型。第一個參數 -1 表示無限循環播放,第二個參數 LoopType.Restart 表示每次循環都從頭開始播放動畫。
尺寸,縮放
// 使得物體進行擴大,第一個參數是擴大的值,第二個值是所需要的時間
transform.DOScale(new Vector3(3, 4, 5), 8);
// 使物體從0擴大到1,
tf.DOScale(Vector3.one, 0.5f).From(Vector3.zero);
彈跳
# 參數解釋
# endValue:到達的結束值
# jumpPower:跳躍的功率(跳躍的最大高度由這個加上最後的Y偏移量)
# numJumps:總跳躍次數
# duration:漸變的持續時間
# snapping :如果為TRUE,漸變將平滑地將所有值捕捉為整數
transform.DOJump(Vector3 endValue, float jumpPower, int numJumps, float duration, bool snapping = false)
// 5秒內彈跳3次,彈到(10, 10, 10)位置
transform.DOJump(new Vector3(10, 10, 10), 3, 5f).SetEase(Ease.OutBack);
漸變透明度
// text 2秒內漸變透明到0
text.DOFade(0, 2f).SetEase(Ease.OutSine);
震動
# 參數1:指定抖動效果的持續時間,以秒為單位。
# 參數2:定義抖動的強度。可以是一個Vector3類型的值,分別表示X、Y和Z軸上的抖動強度。
# 參數3:指定抖動的次數。例如,10表示在持續時間內進行10次振動。
# 參數4:添加一些隨機因素以使抖動看起來更自然。值為0表示沒有隨機性,值為1表示完全隨機。
# 參數5:抖動效果是否被限制在整數值,這個參數用於定義抖動是否應該以整數值進行位置、旋轉或縮放。
// 使物體的位置發生抖動
transform.DOShakePosition(1, new Vector3(0, 0.5f, 0), 20, 0.5f, false);
// 使物體的旋轉發生抖動
transform.DOShakeRotation(0.3f, new Vector3(10f, 10f, 10f), 4, 0, true);
// 使物體的縮放發生抖動
transform.DOShakeScale(0.5f, 0.2f, 10, 0.5f, true);
材質
Material material = GetComponent<MeshRenderer>().material;
// 改變材質的顏色
material.DOColor(Color.red, 5);
// 實現漸變,第一個參數是漸變條,需要提前聲明public Gradient gradient;,第二個參數是時間
material.DOGradientColor(gradient, 5);
// 改變貼圖位置
material.DOOffset(Vector3.one, 0);
// 將兩個材質的顏色混合在一起
material.DOBlendableColor(Color.red, 5);
material.DOBlendableColor(Color.yellow, 5);
攝影機
// 改變攝像機的寬高比,第一個參數是寬高之比,第二個參數是所達成所需要的時間
camera.DOAspect(0.5f, 5);
// 改變攝像機的背景顏色
camera.DOColor(Color.black, 5);
// 改變攝像機拍攝內容的角度,第一個參數是角度大小,第二個參數是時間
camera.DOFieldOfView(2, 5);
// 改變正交攝像機拍攝內容的角度,第一個參數是角度大小,第二個參數是時間
camera.DOOrthoSize(10, 7);
// 實現分屏的兩種方式參數一
// 第一個參數都是縮小之後的位置,第二個參數是按比例縮小
camera.DOPixelRect(new Rect(360, 540, 360, 540), 2);
camera.DORect(new Rect(360, 360, 360, 360), 0.5f);
// 相機震動
// 第一個參數 .2f:是抖動的持續時間,即攝像機會在0.2秒內抖動。
// 第二個參數 .5f:是抖動的強度,控制了攝像機抖動的幅度。
// 第三個參數 14:是抖動的震動次數,即攝像機在指定時間內(0.2秒)內會抖動14次。
// 第四個參數 90:是抖動的隨機性種子,影響抖動的模式和方向。
// 第五個參數 false:是可選的布爾參數,指示是否應忽略時間縮放。如果設為 true,即使 Time.timeScale 不是 1,抖動效果仍會按照實際時間運行。
// 第六個參數 true:是可選的布爾參數,指示是否使用本地坐標進行抖動。如果設為 true,抖動將基於相機的本地坐標系;如果設為 false,則基於世界坐標系
Camera.main.transform.DOShakePosition(.2f, .5f, 14, 90, false, true);
Text文字動畫
// 舊文本控件
Text text = GetComponent<Text>();
// 逐字輸出,第一個參數是輸出的文本,第二個參數是輸出的時間,.SetEase(Ease.Linear)代表均速輸出
text.DOText("46545645646464654", 5).SetEase(Ease.Linear);
// 新文本控件
// Text Mesh Pro並不支持DoTween的DOText方法,你也可以使用DOTween.To方法來實現
TextMeshPro
文本的逐字打印效果
public TextMeshProUGUI text;
public string message;
public float duration = 0.1f;
void Start(){
text.text = "";
string message = "46545645646464654";
DOTween.To(() => 0, AddChar, message.Length, message.Length * duration).SetEase(Ease.Linear);
}
void AddChar(int index)
{
text.text = message.Substring(0, index);
}
佇列
// 構建一個隊列
Sequence quence = DOTween.Sequence();
// 添加事件在隊列之中
quence.Append(transform.DOMove(Vector3.one, 2));
// 加入執行該事件,和之前一個事件一起執行
quence.Join(transform.DOScale(new Vector3(3, 4, 5), 5));
// 讓隊列暫停1秒
quence.AppendInterval(1);
// 運行完上個事件就執行該方法
quence.AppendCallback(InsertCallBack03);
quence.Append(transform.DOMove(new Vector3(1, 0, 0), 2));
// 插入事件,該插入的事件是占用了插入的事件的事件,也可以在超出的事件上插入事件
// 第一個參數是插入的事件,第二個參數是插入的事件
quence.Insert(0, transform.DOMove(-Vector3.one, 1));
// 相當於棧反向的執行順序,會優先執行這部分的事件
quence.PrependInterval(2);
quence.Prepend(transform.DORotate(new Vector3(5, 9, 1), 4));
// 最開始的時候調用該函數
quence.PrependCallback(InsertCallBack01);
// 在指定的事件調用該函數,第一個參數是調用的時間,第二個參數是調用的方法名字
quence.InsertCallback(6, InsertCallBack01);
設定參數
.SetLoops表示循環該事件,
// 裡面的第一個參數代表循環的次數,當為-1的時候代表無限循環,
// 第二個參數為LoopType.Incremental代表累加的循環,每次循環完不回到之前的位置
transform.DOMove(new Vector3(2, 5, 3), 5).SetLoops(10, LoopType.Incremental);
// 使得動畫在運行結束後停下來
transform.DOMove(new Vector3(2, 5, 3), 5).SetLoops(3, LoopType.Incremental).SetAutoKill(true);
// 使得動畫反向進行運動,而且從目標點運動回來
transform.DOMove(new Vector3(2, 5, 3), 5).SetLoops(3, LoopType.Incremental).From();
// 動畫播放完成之後暫停多少時間
transform.DOMove(new Vector3(2, 5, 3), 5).SetLoops(3, LoopType.Incremental).SetDelay(1);
// 當使用了該參數的時候,事件的第二個參數就變成了運動到目標點的速度
transform.DOMove(new Vector3(2, 5, 3), 5).SetSpeedBased(true);
// .SetId()代表給該事件一個標記,DOTween.Play(),代表去DOTween的緩衝池去調用,這樣做可以優化性能
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetId(0);
DOTween.Play(0);
// 當.SetRelative(true)時,這個事件的第一個參數的目標地點位置就變為了一個運動的方向和長度,可以進行累加
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetRelative(true);
// 這個設置參數代表該事件不會受到Unity事件的影響
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetUpdate(UpdateType.Normal, true);
運動曲線,緩動函數
如何使用運動曲線的基本設定。
// 設置曲線的運動函數
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetEase(Ease.);
// 當旋轉運動曲線為flash的時候再加參數代表它來回閃爍,如果第三個參數大於0該物體的活動範圍會漸漸變小,如果等於0會不變,小於0會給目標點一個力
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetEase(Ease.Flash, 3);
Ease.Linear:線性緩動,等速運動。
Ease.InQuad、Ease.OutQuad、Ease.InOutQuad:二次緩動,可達到平滑加速、平滑減速、先加速後減速的效果。
Ease.InOutSine:正弦緩動,產生類似物體來回擺動的效果。
Ease.OutBounce:反彈緩動,產生類似物體撞擊牆壁後反彈的效果。
Ease.OutElastic:彈簧緩動,產生類似物體被拉長後回彈的效果。
自訂運動曲線
// 運動曲線
public
AnimationCurve
curve;
// 自定義運動曲線
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetEase(curve);
// 調用自己編寫的曲線
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).SetEase(EaseFun);
public float EaseFun(float time, float duration, float overshootOrAmplitude, float period)
{
return time / duration;
}
回呼函數
// 動畫被殺死的執行函數
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnKill(() => { Debug.Log(1); });
// 開始運行的時候執行函數
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnPlay(() => { Debug.Log(1); });
// 完成的時候執行函數
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnComplete(() => { Debug.Log(1); });
// 暫停的時候執行
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnPause(() => { Debug.Log(1); });
// 第一次運行动畫的時候執行
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnStart(() => { Debug.Log(1); });
// 循環的時候執行
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnStepComplete(() => { Debug.Log(1); });
// 在這個動畫的幀內都會被執行
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnUpdate(() => { Debug.Log(1); });
// 在動畫重新播放的時候會被執行
transform.DOBlendableMoveBy(new Vector3(2, 5, 3), 5).OnRewind(() => { Debug.Log(1); });
控制函數
// 暫停
transform.DOPause();
// 開始
transform.DOPlay();
// 重新播放
transform.DORestart();
// 回到起始位置(很快)
transform.DORewind();
// 回到起始位置(很慢)
transform.DOSmoothRewind();
// 殺死動畫
transform.DOKill();
// 反轉動畫,把起始點變為目標點
transform.DOFlip();
// 代表跳轉到動畫第幾秒
transform.DOGoto(2, true);
// 反向播放動畫
transform.DOPlayBackwards();
// 正向播放動畫
transform.DOPlayForward();
// 在運行狀態下運行就是暫停,在暫停狀態下運行就是播放
transform.DOTogglePause();
取得數據
// 獲得所有的暫停的動畫
var list = DOTween.PausedTweens();
// 獲得所有在播放的動畫
var list1 = DOTween.PlayingTweens();
// 尋找Id為該字符串的動畫,第二個參數代表獲取當前播放的動畫
var list2 = DOTween.TweensById("ID", true);
// 返回的是該動畫上有什麼緩衝下來的動畫都會被收集下來
var list3 = DOTween.TweensByTarget(transform, true);
// 尋找這個動畫是否有動畫,第二個參數為true時,代表尋找該動畫是否正在播放
var list4 = DOTween.IsTweening("id", true);
// 尋找所有正在播放的動畫,包括延遲動畫
var list5 = DOTween.TotalPlayingTweens();
// 控制動畫的播放的時間的指針
transform.DOMove(Vector3.one, 5).fullPosition = 0;
var tween = transform.DOMove(Vector3.one, 5);
// 獲取到該動畫的循環次數
tween.CompletedLoops();
// 獲取動畫的延遲時間
tween.Delay();
// 動畫的持續時間,參數代表是否包括循環的時間
tween.Duration(true);
// 動畫的播放的時間,參數代表是否包括循環的時間
tween.Elapsed();
// 返回的是進程的百分比
tween.ElapsedDirectionalPercentage();
// 返回的是動畫的已用的百分比,參數代表是否包括循環的時間
tween.ElapsedPercentage();
// 判斷動畫是否是反向的
tween.IsBackwards();
// 判斷動畫是否已經完成
tween.IsComplete();
攜程
tween = transform.DOMove(Vector3.one, 2).SetLoops(3);
StartCoroutine(Wait());
private IEnumerator Wait()
{
// 等動畫播放完再執行下面的語句
yield return tween.WaitForCompletion();
Debug.Log(0);
// 等待動畫循環到第幾次執行下面的語句
yield return tween.AsyncWaitForElapsedLoops(2);
Debug.Log(1);
// 動畫被殺時執行下面的語句
yield return tween.WaitForKill();
Debug.Log(2);
// 動畫執行到該時間才會繼續執行下面的方法
yield return tween.WaitForPosition(1.5f);
Debug.Log(3);
// 動畫重新播放的時候執行下面的方法
yield return tween.WaitForRewind();
Debug.Log(4);
// 動畫開始執行的時候調用
yield return tween.WaitForStart();
Debug.Log(5);
}
路勁動畫
using System.Linq;
// 是將數組存放在positions裡面
var positions = postionList.Select(u => u.position).ToArray();
// 第一個參數是存放位置的數組,第二個參數是運行的時間,第三個參數是規定點之間是直線運行還是曲線運行
transform.DOPath(positions, 2);
// 將第一個位置和最後一個位置連起來,.SetOptions()的第一個參數是是否將首尾連接,第二個參數是鎖定軸
// SetLookAt()裡面的參數代表看向的位置,當參數是0該物體一直看向路徑的前方,朝向針對運動方向的百分比從0-1
transform.DOPath(positions, 5, PathType.CatmullRom, PathMode.Full3D, 50).SetOptions(true).SetLookAt(0);
經典案例
實戰案例1
使用面板先經過 0.4sY 軸縮放從 0 變成 1,再暫停 showTime 秒後,經過 0.4sY 軸縮放從 1 變回 0,動畫播放完成呼叫 OnComplete 事件。
// 方法一
// Sequence sequence = DOTween.Sequence();
// sequence.Append(ui.transform.DOScaleY(1, 0.4f).From(0)) // 第一个動畫,縮放到 1
// .Append(DOVirtual.DelayedCall(showTime, () => { })) // 延遲
// .Append(ui.transform.DOScaleY(0, 0.4f).From(1)) // 第二個動畫,縮放到 0
// .OnComplete(() =>
// {
// ui.gameObject.SetActive(false); // 隱藏 UI
// callback?.Invoke(); // 調用回調
// });
// 方法二
ui.transform
.DOScaleY(1, 0.4f)
.From(0)
.OnComplete(() =>
{
// 延遲顯示時間
DOVirtual.DelayedCall(showTime, () =>
{
ui.transform.DOScaleY(0, 0.4f).From(1)
.OnComplete(() =>
{
// 動畫完成時執行的操作
});
});
});
實戰案例2
實現兩個動畫同時執行,淡出並向 x 軸移動。
CanvasGroup canvasGroup = ui.transform.GetComponent<CanvasGroup>();
Sequence closeSequence = DOTween.Sequence();
closeSequence.Append(canvasGroup.DOFade(0, 0.8f)) // 淡出
.Join(ui.transform.DOLocalMoveX(2000f, 0.8f)) // 同時移動
.OnComplete(() =>
{
// 動畫完成時執行的操作
canvasGroup.alpha = 1;
});
DoTween 動畫插件下載點
————————————————
更多好用插件:【Unity 好用插件推薦】持續更新,一起讓遊戲開發事半功倍!
本文原創(或整理)於亞洲電玩通,未經作者與本站同意不得隨意引用、轉載、改編或截錄。
特約作家簡介
支持贊助 / DONATE
亞洲電玩通只是很小的力量,但仍希望為復甦台灣遊戲研發貢獻一點動能,如果您喜歡亞洲電玩通的文章,或是覺得它們對您有幫助,歡迎給予一些支持鼓勵,不論是按讚追蹤或是贊助,讓亞洲電玩通持續產出,感謝。
BTC |
352Bw8r46rfXv6jno8qt9Bc3xx6ptTcPze |
ETH |
0x795442E321a953363a442C76d39f3fbf9b6bC666 |
TRON |
TCNcVmin18LbnXfdWZsY5pzcFvYe1MoD6f |