參考自DOTween官方文檔:
DOTween起始上手起來很快,當然前提也是用心看一下哈。> 可以在Unity AssetStore下載得到。
使用方法:
准備:
在導入DOTween后,你需要設置dotween額外的庫設置基你的Unity版本。Tools—–>DOTween Utility
Panel——>點擊SetupDoTween即可。DOTween只是為了對應Unity的版本不需關心更多。**
一,最先簡單的使用一下DOTween:
using UnityEngine; using System.Collections; using DG.Tweening;//DOTween命名空間 public class Basics : MonoBehaviour { //tweeen的目標對象 public Transform cubeA, cubeB; void Start() { //全局初始化 DOTween.Init(false, true, LogBehaviour.ErrorsOnly); //快捷方式創建tween cubeA.DOMove(new Vector3(-2, 2, 0), 1).SetRelative().SetLoops(-1, LoopType.Yoyo); //通用方式創建tween DOTween.To(()=> cubeB.position, x=> cubeB.position = x, new Vector3(-2, 2, 0), 1).SetRelative().SetLoops(-1, LoopType.Yoyo); } }
給cubeA,B指定連個Cube后運行,就可以看到效果了。
前提說明:
Tweener:一個持有值的控制並使值起作用的tween
Sequence:一個特殊的tween,與其控制一個值,Sequence控制其它tweens和將它們當成一個組。
Tween:一個通用的詞,表名包括Tweener和Sequence Nested
tween : 一個包含在Sequence內的tween。方法前綴:Prefixes 前綴對於編輯器代碼感應很重要,所以計量記住這些:
DO開頭:操作所有已知對象,如transform對象或material對象。當然也是DOTween類的前綴。
transform.DOMoveX(10, 1);
transform.DORestart();
DOTween.Play();Set: 所有可以鏈式返回tween的設置。(除了From之外,盡管把它當作一個設置來用,但它實際上並不是一個真正的設置)
myTween.SetLoops(4, LoopType.Yoyo).SetSpeedBased();
On: 所有可鏈式返回tween的回調
myTween.OnStart(myStartFun).OnComplete(myFunction);
二 ,解析(初始化):
1,在要使用Dotween的類里引入命名空間 DG.Tweening;
2,初始化DOTween全局配置,不初始化將使用默認值,后面仍可以改變初始化的配置,具體方法下步。
需要記住:如果在創建第一個Tween后才調用DOTween.Init將不會生效。
考慮到你仍然在任何時候初始化設置,可以使用全局設置。Global settings
通常,你可以在調用DOTween后鏈式調用DOTween.SetTweensCapacity來一同初始化可同時執行最大的Tweers和Sequence數量。
例子如下舉例B:還有多一種選擇就是使用設置Panel的初始化配置:假如在DOTween.Iint初始化時不傳任何參數或者傳空,那么DOTween將會對此參數使用Panel的設置,但仍需要在代碼調用一次Init並參數為空,要不將使用默認的參數。如:
在Unity工具欄: Tools—–>DOTween Utility Panel—>Preferences 設置:
//舉例A,使用設置面板的初始化設置 DOTween.Init(); //舉例B:用指定參數初始化,並同時指定最大同時執行Tweeners和Sequence的容量 DOTween.Init(true, true, LogBehaviour.Verbose).SetCapacity(200, 10);
解析一下初始化參數
/// <summary> /// 初始化 /// </summary> /// <param name="recycleAllByDefault"> /// 默認值為false /// 如果為true那么所創建的tween建可以循環利用,這意味着當tween播放掛起時並不會被摧毀, /// 它們將會被放到緩存池待重新使用,這樣可以避免GC再為可重復利用的tween分配。但tween掛起你 /// 將需要注意對tween的引用,因為它們就算掛起了,仍可以會被激活,也有可能正被其它的tween使用而被激活。 /// 如果你想tween掛起時自動把tween設置為null,可以這樣: /// myTween.OnKill(()=>mytween = null) /// 你任何時候都可以改變這個設置: /// 改變靜態變量DG.Tweening.DOTween.defaultRecyclable的參數 /// 或者你也可以為某個tween指定設置這個參數:myTween.SetRecyclable(bool recyclable) /// /// </param> /// <param name="useSafeMode"> /// 默認為false /// 如果為true,那么tween將會有些性能將會低一些,但更安全,tween將會去處理一系列事情,如tween在播放而目標為空。 /// </param> /// <param name="logBehaviour"> /// 打印什么類型日志,默認打印error類型 /// </param> /// <returns></returns> public static IDOTweenInit Init(bool? recycleAllByDefault = null, bool? useSafeMode = null, LogBehaviour? logBehaviour = null);
三,解析(tween創建方式和設置tween):
創建tween有3中方式:通用方式,快捷方式,額外通用方式。
1,通用方式: 這是最靈活的方式,播放中間幾乎允許你進行任何值得運算,包括public private static或dynamic(和你想的一樣,快捷調用方式最后也是調用這個方法)
//使myVector在一秒內變換到到3,4,8 DOTween.To(getter, setter, to, float duration) DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1); // 在一秒內變換float類型值到52 DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);
2,快捷方式:
DOTween的快捷方法一些Unity類實例可以使用,像transform, Rigibody和Material等,可以直接從它們的引用開始一個tween, (也將自動的設置這個對象自身為tween驅動的對象) 除了個別指定的外,每個快捷調用也都有一個Form()方法的調用,直接在快捷方法后鏈式調用From()就會把目標 tween變為起始Tween(也就是把始終位置調換)。 記住:當把Form分配給tween時,目標對象位置將直接跳到起始位置(你寫那行代碼時就跳,而不是等到tween啟動)。
//transform將移動到Vector3(2,3,4) transform.DOMove(new Vector3(2,3,4), 1); rigidbody.DOMove(new Vector3(2,3,4), 1); material.DOColor(Color.green, 1); //From()后反過來,從Vector(2,3,4)到現在的位置 transform.DOMove(new Vector3(2,3,4), 1).From(); rigidbody.DOMove(new Vector3(2,3,4), 1).From(); material.DOColor(Color.green, 1).From(); ```
3,額外通用的法式:
這些額外通用的方式允許tween的值通過特殊的方式指定。 除了指定的外,這些方式也有Form(),與快捷調用類似。
DOTween.Shake(()=> myVector, x=> myVector = x, 1, 5, 10, 45, false); DOTween.ToAlpha(()=> myColor, x=> myColor = x, 0, 1);
無論使用哪種方法,最終會返回一個Twenner或Sequence 所以你仍然可以保持着它們的引用,也可以不關心他們的區別都保存為一個Tween。 也可以直接使用DOTween的多種靜態方控制Tween:
//回放所有 tween DOTween.RewindAll(); //回放指定ID的 tween DOTween.Rewind(myId);
以上只是創建了tween,下面說明如何設置tween,如 漸變類型,全局時間縮放等。
設置分為全局設置和特殊設置:
1,全局設置:
你可以設置全局配置,這將應用到新建的tween,全局設置允許設置tween自動播放那個和自動關閉行為,漸變類型,全局時間縮放,之類的參數。 設置的方法通常都是DOTween的靜態方法:
DOTween.defaultAutoKill = false; DOTween.defaultEaseType = Ease.InOutCirc;
2,特殊設置:
特殊設置是通過分配的鏈將以“Set”開始(callback除外),所以編輯器的代碼感知會幫你找到它們。
//創建一個transformtween,設置它的ease,loops和完成回調 transform.DOMove(new Vector3(2,2,2), 2) .SetEase(Ease.OutQuint) .SetLoops(4) .OnComplete(myFunction);
//同上,但持有tween的引用來設置,不使用鏈式編程
Tween myTween = transform.DOMove(new Vector3(2,2,2), 2); myTween.SetEase(Ease.OutQuint); myTween.SetLoops(4); myTween.OnComplete(myFunction);
然而,一些tween類型有它們特殊的選項,這個由tween的值類型可不可以設置SetOptions()決定,只要記住setOption()是特殊的,在maim tween的創建方法后要立刻綁定調用:
//和之前的例子一樣,但強制轉換transform為interger單元值(這對像素填充來說很有用)
transform.DOMove(new Vector3(2,2,2), 2) .SetOptions(true) .SetEase(Ease.OutQuint) .SetLoops(4) .OnComplete(myFunction);。
甚至可以copy一個tween的設置到另一個tween,使用SetAs()
//創建一個tween並進行設置,然后保持它的引用 Tween myTween = transform.DOMove(new Vector3(2,2,2), 2) .SetEase(Ease.OutQuint) .SetLoops(4) .OnComplete(myFunction); //C創建另外一個tween,使用上一個相同的設置 material.DOColor(Color.red, 2) .SetAs(myTween); //所有的tween將以Ease.OutQunit 循環loop 4次,完成后調用同一方法,即使tween的對象和類型不一樣
四,創建一個Sequence:
Sequence像Tweeners,但並不直接控制參數或值,而是把Tweeners或Sequence當成一個組。
Sequence可以包含Sequence,多少有hirecrchy的深度決定,沒有限制。
可以用如下兩個步奏創建一個Sequence:
//1,獲取一個新的Sequence,並保持它的引用 //返回一個可用的Sequence,你可以往里面Add tween它會保存起來 equence mySequence = DOTween.Sequence(); //2,增加tween,間隔和回調到Sequence //記住:這些方法必須在Sequence Start前的起作用(通常是你創建之后的下一幀,除非已停止),在Start之后的將不會有效果。 mySequence.Append(transform.DOMoveX(45, 1)); mySequence.AppendInterval(interval); //給定的時間插入一個tween,允許你重疊已存在的tween而不是替換 mySequence.InsertCallback(1, MyCallback);
提示:如果你創建一個Sequence知識為了使用回調和定時器,那么可以這樣使用:
// 獲取一個空的Sequence
Sequence mySequence = DOTween.Sequence(); // 在開啟添加一個move的tween mySequence.Append(transform.DOMoveX(45, 1)); // 在第一個結束后開啟一個旋轉的tween mySequence.Append(transform.DORotate(new Vector3(0,180,0), 1)); // 所有的延遲一秒 mySequence.PrependInterval(1); // 在整個Sequence期間插入一個縮放的tween mySequence.Insert(0, transform.DOScale(new Vector3(3,3,3), mySequence.Duration())); //和上面的例子效果一樣,但使用鏈式編程,使其看起來更簡潔 Sequence mySequence = DOTween.Sequence(); mySequence.Append(transform.DOMoveX(45, 1)) .Append(transform.DORotate(new Vector3(0,180,0), 1)) .PrependInterval(1) .Insert(0, transform.DOScale(new Vector3(3,3,3), mySequence.Duration()));
五,其它:
當你創建一個tween的時候它將會自動播放直到完成loop次數,除非你改變全局設置的defaultAutoPlay設置。
當一個tween播放完成將會自己摧毀,這意味着你不能再次使用這個tween,除非你改變全局設置的defultAutoKill
如果你的tween的target為空,在tween播放時將會報錯,你需要注意這個問題或者激活安全模式。如果你激活recycling(再循環),DOTween將會緩存你創建的所有的tween,所以可以不再建新的tween就可以重復利用它們。
當然,為了避免占用過大的資源,里面設置最大200個tween和50個Sequence同時運行,如果需要更多,DOTween將自動遞增容量,但你也可以直接閉避免卡頓自動調整容量
//設置最大tween數量3000和最大Sequences數量200:
DOTWeen.SetTweensCapacity(3000,200);
任何時候你想清除DOTween的緩存或徹底重置它們,可以調用DOTween.Clean(),這將摧毀所有的tween和清除所有的DOTween緩存。//循環利用a tween
你不需要手動循環利用tweens,你可以選擇自動重復利用全部或者只指定一些,你依舊可以任何時候改變Tweener的結束和開始值