1、命名法
Tweener(補間器):一種控制某個值并對其進行動畫處理的補間。
Sequence(序列):一種特殊的補間,它不直接控制某個值,而是控制其他補間并將它們作為一個組進行動畫處理。
Tween(補間):一個通用術語,既指代 Tweener 也指代 Sequence。
Nested tween(嵌套補間):包含在 Sequence 中的補間。
前綴
前綴對于充分利用 IntelliSense 非常重要,所以盡量記住這些:
DO :前綴用于所有補間快捷方式(可以從已知對象,如變換或材質直接啟動的操作)。
transform.DOMoveX(100, 1);
transform.DORestart();
DOTween.Play();
Set:所有可以鏈接到補間的設置(除了 From,因為它作為設置應用但并不真正屬于設置)的前綴。
myTween.SetLoops(4, LoopType.Yoyo).SetSpeedBased();
On :用于所有可以鏈接到補間的回調函數。
myTween.OnStart(myStartFunction).OnComplete(myCompleteFunction);
2、DOTween.Init
首次創建補間時,DOTween 會使用默認值自動初始化自身。如果你希望手動初始化它(推薦),請在創建任何補間之前調用一次此方法(之后調用將不會有任何效果)。請注意,你仍然可以通過 DOTween 的全局設置隨時更改所有初始化設置。另外,你可以將 SetCapacity 方法鏈接到 Init 方法上,這允許設置 Tweeners/Sequences 的初始容量(這與稍后調用 DOTween.SetTweensCapacity 是相同的)。
? public static IDOTweenInit Init(bool? recycleAllByDefault = null, bool? useSafeMode = null, LogBehaviour? logBehaviour = null);
初始化 DOTween。調用時不帶任何參數以使用你在 DOTween 的工具面板中設置的首選項(否則這些首選項將被傳遞的任何參數覆蓋)。
recycleAllByDefault:如果為 TRUE,則所有新的補間都將被設置為可回收,這意味著當它們被銷毀時不會真正銷毀,而是會被放入池中并重用,而不是創建新的補間。此選項允許你通過重用補間來避免垃圾回收分配,但你需要小心處理補間引用,因為即使補間已被銷毀,它們也可能依然活躍(因為它們可能已經被重新生成并作為完全不同的補間在使用)。
如果你希望在補間被銷毀時自動將其引用設置為 NULL,可以使用 OnKill 回調,如下所示:
// 使用 OnKill 回調自動將補間引用設置為 NULL
myTween.OnKill(() => myTween = null);
你可以隨時通過更改靜態屬性 DOTween.defaultRecyclable 來修改此設置,或者你可以使用 SetRecyclable 為每個補間單獨設置回收行為。
useSafeMode:如果設置為 TRUE,補間會稍微慢一些,但更安全,允許 DOTween 自動處理諸如在補間運行時目標被銷毀的情況。
警告:在 iOS 上,safeMode 僅在剝離級別設置為 "Strip Assemblies" 或腳本調用優化設置為 "Slow and Safe" 時有效,而在 Windows 10 WSA 上,如果選擇了 Master Configuration 和 .NET,則不會生效。
logBehaviour:根據所選模式,DOTween 將記錄僅錯誤、錯誤和警告,或所有信息加上附加信息。
// 示例 A:使用 DOTween 的工具面板中設置的首選項進行初始化
DOTween.Init();
// 示例 B:使用自定義設置進行初始化,并立即設置容量
DOTween.Init(true, true, LogBehaviour.Verbose).SetCapacity(200, 10);
3、創建一個Tweener
截至目前,DOTween
可以補間這些類型的值:?float
,double
,int
,uint
,long
,ulong
,Vector2 / 3/4
,Quaternion
,Rect
,RectOffset
,Color
,string
?(其中一些值可以通過特殊方式進行補間) 此外,您可以創建自定義DOTween
插件以補間自定義值類型。
有3種方法來創建一個Tweener
:在通用的方式,快捷方式和更多的通用方式。
A. 通用方式
這是最靈活的補間方式,允許你幾乎任何值,公共或私有,靜態或動態 (只是你知道,快捷方式實際上在后臺使用通用方式)。
與快捷方式一樣,通用方式具有FROM
備用版本。只需將From
鏈接到Tweener
,使補間表現為FROM
補間而不是TO
補間。
static DOTween.To(getter,setter,to,float duration)
B. 快捷方式
DOTween
包含一些已知Unity
對象的快捷方式,如Transform
,Rigidbody
和Material
。您可以直接從對這些對象的引用啟動補間(這也將自動將對象本身設置為補間目標),如:
transform.DOMove(new Vector3(2,3,4), 1);rigidbody.DOMove(new Vector3(2,3,4), 1);material.DOColor(Color.green, 1);
除非另有說明,否則這些快捷方式中的每一個都具有FROM
備用版本。只需將From
鏈接到Tweener
,使補間表現為FROM
補間而不是TO
補間。
重要提示:當您將一個FROM
分配給補間時,目標將立即跳轉到FROM
位置(就像“編寫該行代碼的那一刻”,而不是“補間開始的那一刻”)。
transform.DOMove(new Vector3(2,3,4), 1).From();rigidbody.DOMove(new Vector3(2,3,4), 1).From();material.DOColor(Color.green, 1).From();
AudioSource
DOFade(float to, float duration)
DOPitch(float to, float duration)
Camera
DOAspect(float to, float duration)
DOColor(Color to, float duration)
DOFarClipPlane(float to, float duration)
DOFieldOfView(float to, float duration)
DONearClipPlane(float to, float duration)
DOOrthoSize(float to, float duration)
DOPixelRect(Rect to, float duration)
DORect(Rect to, float duration)
DOShakePosition(float duration, float/Vector3 strength, int vibrato, bool fadeOut)
DOShakeRotation(float duration, float/Vector3 strength, int vibrato, float randomness bool fadeOut)
Light
DOColor(Color to, float duration)
DOIntensity(float to, float duration)
DOShadowStrength(float to, float duration)
可混合的補間
DOBlendableColor(Color to, float duration)
LineRenderer
DOColor(Color2 startValue, Color2 endValue, float duration)
Material
DOColor(Color to, float duration)
DOColor(Color to, string property, float duration)
DOFade(float to, float duration)
DOFade(float to, string property, float duration)
DOFloat(float to, string property, float duration)
DOGradientColor(Gradient to, float duration)
DOGradientColor(Gradient to, string property, float duration)
DOOffset(Vector2 to, float duration)
DOOffset(Vector2 to, string property, float duration)
DOTiling(Vector2 to, float duration)
DOTiling(Vector2 to, string property, float duration)
DOVector(Vector4 to, string property, float duration)
可混合的補間
DOBlendableColor(Color to, float duration)
DOBlendableColor(Color to, string property, float duration)
Rigidbody這些快捷方式在后臺使用剛體的MovePosition
?/?MoveRotation
方法,以正確設置與物理對象相關的內容。
DOMove(Vector3 to,float duration,bool snapping)
DOMoveX / DOMoveY / DOMoveZ(float to,float duration,bool snapping)
DOJump(Vector3 endValue,float jumpPower,int numJumps,float duration,bool snapping)
DORotate(Vector3 to, float duration, RotateMode mode)
DOLookAt(Vector3 towards, float duration, AxisConstraint axisConstraint = AxisConstraint.None, Vector3 up = Vector3.up)
PRO ONLY ? Spiral – no FROM
DOSpiral(float duration, Vector3 axis = null, SpiralMode mode = SpiralMode.Expand, float speed = 1, float frequency = 10, float depth = 0, bool snapping = false)
SpriteRenderer
DOColor(Color to, float duration)
DOFade(float to, float duration)
DOGradientColor(Gradient to, float duration)
C. 其他通用方法
這些是允許以特定方式補間值的其他通用方法。這些也有FROM
備用版本,除非另有說明。只需將From
鏈接到Tweener
,使補間表現為FROM
補間而不是TO
補間。
static DOTween.Punch(getter, setter, Vector3 direction, float duration, int vibrato, float elasticity)
static DOTween.Shake(getter, setter, float duration, float/Vector3 strength, int vibrato, float randomness, bool ignoreZAxis)
static DOTween.ToAlpha(getter, setter, float to, float duration)
static DOTween.ToArray(getter, setter, float to, float duration)
static DOTween.ToAxis(getter, setter, float to, float duration, AxisConstraint axis)
4、創建序列
序列類似于Tweeners
,但它們不是動畫屬性或值,而是將其他Tweeners
或Sequences
作為一組動畫。序列可以包含在其他序列中,而不限制層次結構的深度。排序的補間不必一個接一個。您可以使用Insert
方法重疊補間。
補間(序列或Tweener
)只能嵌套在單個其他序列中,這意味著您不能在多個序列中重用相同的補間。此外,主序列將控制其所有嵌套元素,并且您將無法單獨控制嵌套補間(將序列視為電影時間軸,一旦它第一次啟動就會變為固定)。
重要提示:不要使用空序列。
1.獲取要使用的新序列并將其存儲為引用
static DOTween.Sequence()
2.將補間,間隔和回調添加到序列
請注意,所有這些方法都需要在序列開始之前應用(通常是在創建它之后的下一幀,除非它已暫停),否則它們將沒有任何效果。另請注意,任何嵌套的Tweener
?/?Sequence
都需要在將其添加到Sequence
之前完全創建,因為之后它將被鎖定。
Append(Tween tween)AppendCallback(TweenCallback callback)AppendInterval(float interval)Insert(float atPosition, Tween tween)InsertCallback(float atPosition, TweenCallback callback)Join(Tween tween)Prepend(Tween tween)PrependCallback(TweenCallback callback)PrependInterval(float interval)
// 創建一個 Sequence
Sequence mySequence = DOTween.Sequence();// 在 Sequence 的開頭添加一個 1 秒的延遲
mySequence.PrependInterval(1);// 在 Sequence 的末尾添加一個移動 Tween,物體將在 X 軸上移動到 45,耗時 1 秒
mySequence.Append(transform.DOMoveX(45, 1));// 在移動 Tween 完成后,添加一個旋轉 Tween,物體將旋轉到 (0, 180, 0) 的角度,耗時 1 秒
mySequence.Append(transform.DORotate(new Vector3(0, 180, 0), 1));// 在 Sequence 的 0 秒處插入一個縮放 Tween,物體將縮放到 (3, 3, 3) 的大小,持續整個 Sequence 的時長
mySequence.Insert(0, transform.DOScale(new Vector3(3, 3, 3), mySequence.Duration()));動畫流程
延遲 1 秒:Sequence 開始前會等待 1 秒。
移動動畫:物體在 X 軸上從當前位置移動到 45,耗時 1 秒。
旋轉動畫:物體旋轉到 (0, 180, 0) 的角度,耗時 1 秒。
縮放動畫:物體從 Sequence 開始時就逐漸縮放到 (3, 3, 3) 的大小,持續整個 Sequence 的時長。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()));
5、設置,選項和回調
在將設置應用于補間時,DOTween
使用鏈接方法。或者,您可以更改將應用??于所有新創建的補間的全局默認選項。
全局設置
static LogBehaviour DOTween.logBehaviourstatic bool DOTween.maxSmoothUnscaledTimestatic bool DOTween.showUnityEditorReportstatic float DOTween.timeScalestatic bool DOTween.useSafeModestatic bool DOTween.useSmoothDeltaTimestatic DOTween.SetTweensCapacity(int maxTweeners, int maxSequences)
應用于所有新創建的補間的設置
static bool DOTween.defaultAutoKillstatic AutoPlay DOTween.defaultAutoPlaystatic float DOTween.defaultEaseOvershootOrAmplitudestatic float DOTween.defaultEasePeriodstatic Ease DOTween.defaultEaseTypestatic LoopType DOTween.defaultLoopTypestatic bool DOTween.defaultRecyclablestatic bool DOTween.defaultTimeScaleIndependentstatic UpdateType DOTween.defaultUpdateType
Tweener 和 Sequence 設置
SetAs(Tween tween \ TweenParams tweenParams)SetAutoKill(bool autoKillOnCompletion = true)SetEase(Ease easeType \ AnimationCurve animCurve \ EaseFunction customEase)SetId(object id)SetLoops(int loops, LoopType loopType = LoopType.Restart)SetRecyclable(bool recyclable)SetRelative(bool isRelative = true)SetUpdate(UpdateType updateType, bool isIndependentUpdate = false)
OnComplete(TweenCallback callback)OnKill(TweenCallback callback)OnPlay(TweenCallback callback)OnPause(TweenCallback callback)OnRewind(TweenCallback callback)OnStart(TweenCallback callback)OnStepComplete(TweenCallback callback)OnUpdate(TweenCallback callback)OnWaypointChange(TweenCallback<int> callback)
特定于Tweener的設置和選項
這些設置特定于Tweeners
,對序列沒有影響。 除了SetEase
在補間運行時鏈接這些設置將不起作用。
From(bool isRelative = false)SetDelay(float delay)SetSpeedBased(bool isSpeedBased = true)
需要記住的重要一點是,雖然所有其他設置可以按任何順序鏈接在一起,但SetOptions
?必須在補間創建功能之后立即鏈接,否則它將不再可用。
DOPath特定選項
Path tween ? SetOptions(bool closePath, AxisConstraint lockPosition = AxisConstraint.None, AxisConstraint lockRotation = AxisConstraint.None)Path tween ? SetLookAt(Vector3 lookAtPosition/lookAtTarget/lookAhead, Vector3 forwardDirection, Vector3 up = Vector3.up)
6、路徑動畫 API?
1. 路徑動畫概述
路徑動畫允許物體沿著指定的路徑移動。Dotween 提供了兩種主要的路徑動畫方式:
-
使用?
DOPath
:?物體沿著路徑移動,但不會調整自身方向。 -
使用?
DOLocalPath
:?物體沿著局部路徑移動。 -
使用?
DOPath
?和?PathType.CatmullRom
:?使用 Catmull-Rom 樣條曲線生成平滑路徑。
2.解析
2.1 transform.DOPath
讓物體沿著指定的路徑點移動。
參數:
-
path
?(Vector3[]): 路徑點的數組。 -
duration
?(float): 動畫持續時間。 -
pathType
?(PathType): 路徑類型,默認為直線路徑(PathType.Linear
)。 -
pathMode
?(PathMode): 路徑模式,默認為 3D 路徑(PathMode.Full3D
)。 -
resolution
?(int): 路徑分辨率,默認為 10。 -
gizmoColor
?(Color): 在 Scene 視圖中繪制路徑的顏色。
// 定義路徑點
Vector3[] pathPoints = new Vector3[] {new Vector3(0, 0, 0),new Vector3(5, 5, 0),new Vector3(10, 0, 0)
};// 讓物體沿著路徑移動,耗時 3 秒
transform.DOPath(pathPoints, 3, PathType.CatmullRom).SetEase(Ease.Linear).OnComplete(() => Debug.Log("路徑動畫完成"));
2.2 transform.DOLocalPath
讓物體沿著局部坐標系下的路徑移動。
參數:
與?DOPath
?相同。
// 定義局部路徑點
Vector3[] localPathPoints = new Vector3[] {new Vector3(0, 0, 0),new Vector3(2, 2, 0),new Vector3(4, 0, 0)
};// 讓物體沿著局部路徑移動,耗時 2 秒
transform.DOLocalPath(localPathPoints, 2, PathType.CatmullRom).SetEase(Ease.Linear);
2.3 transform.DOPath 的 LookAt 功能
讓物體在移動時始終朝向路徑方向。
參數:
-
lookAhead
?(float): 向前看的位置偏移量,默認為 0.01。 -
forwardDirection
?(Vector3): 物體的前方方向,默認為?Vector3.forward
。 -
up
?(Vector3): 物體的上方方向,默認為?Vector3.up
。
// 讓物體沿著路徑移動,并始終朝向路徑方向
transform.DOPath(pathPoints, 3, PathType.CatmullRom).SetLookAt(0.01f) // 朝向路徑方向.SetEase(Ease.Linear);
2.4 tween.PathLength
計算路徑的長度。
2.5t ween.PathGetPoint
參數:
-
t
?(float): 時間點(0 到 1 之間)。
void Test_06(){Vector3[] pathPoints = new[] {new Vector3(0,1,0),new Vector3(0,2,0),new Vector3(0,3,0),new Vector3(0,4,0)};Tween tween = transform.DOPath(pathPoints, 3, PathType.Linear);tween.ForceInit();float pathLength = tween.PathLength();Debug.Log("路徑長度: " + pathLength);// 獲取路徑上 50% 時間點的位置Vector3 point = tween.PathGetPoint(0.5f);Debug.Log("路徑中點位置: " + point);}
3. 路徑動畫的高級功能
3.1 自定義路徑緩動
可以通過?SetEase
?方法設置路徑動畫的緩動函數。
// 使用緩動函數
transform.DOPath(pathPoints, 3, PathType.CatmullRom).SetEase(Ease.InOutSine);
3.2 路徑動畫的循環
可以通過?SetLoops
?方法設置路徑動畫的循環次數。
// 讓路徑動畫循環 3 次
transform.DOPath(pathPoints, 3, PathType.CatmullRom).SetLoops(3, LoopType.Restart);
3.3 路徑動畫的回調
可以通過?OnComplete
、OnStart
、OnUpdate
?等方法設置路徑動畫的回調。
// 設置路徑動畫的回調
transform.DOPath(pathPoints, 3, PathType.CatmullRom).OnStart(() => Debug.Log("路徑動畫開始")).OnUpdate(() => Debug.Log("路徑動畫進行中")).OnComplete(() => Debug.Log("路徑動畫完成"));