本文及系列參考於Andy老師的DOTween系列
歡迎大家關注Andy老師
10、獲取數據
類方法
返回所有暫停的動畫,沒有則返回null
var list = DOTween.PausedTweens();
返回所有真正播放的動畫,沒有則返回null
var list = DOTween.PlayingTweens();
獲取給定ID的數組
var list = DOTween.TweensById("id", true);
//第一個參數是動畫的ID
//第二個參數是是否只收集正在播放的動畫
返回給定對象上播放或緩存的動畫數組
var list = DOTween.TweensByTarget(transform, true);
//第一個參數是播放動畫的對象
//例如:transform.DOMove(Vector3.one, 2); 第一個參數就傳入transform
//material.DOColor(Color.White, 2); 第一個參數就傳入材質對象material
//第二個參數是是否只收集正在播放的動畫
檢測傳入的對象是否有動畫在活動
bool isTween = DOTween.IsTweening(transform);
//第一個參數為檢測的對象
//第二個參數為是否檢測動畫在播放狀態
//為true時,給定對象在播放狀態時 返回true
//為false時,只檢測給定對象是否有動畫(在pause狀態時也算)有則返回true
正在播放的動畫的總數,目前處於延遲播放狀態的動畫也算
int allPlaying = DOTween.TotalPlayingTweens();
**實例方法** Tweener _tweener = transform.DOMove(Vector3.one, 2);
表示動畫已經執行時間的屬性,可讀可寫
_tweener.fullPosition = 1;
表示動畫已經執行的次數
_tweener.CompletedLoops();
獲取動畫的延遲時間
_tweener.Delay();
獲取動畫的持續時間
//參數為true 表示計算循環的時間,無限循環為Infinity
_tweener.Duration(false);
動畫已播放的時間
//參數為true 表示計算循環的時間
_tweener.Elapsed();
返回動畫進度的百分比
//起始點為0 目標點為1 當yoyo循環模式下,值會從0變到1再從1變到0
_tweener.ElapsedDirectionalPercentage();
返回動畫區間已用的百分比
//單次循環的數值為0到1
//參數為 是否包含循環 為true時 返回值是循環總區間的已用百分比 若為無限循環 返回值為0
_tweener.ElapsedPercentage(true);
動畫是否在活動
_tweener.IsActive();
是否是反向動畫
_tweener.IsBackwards();
動畫是否完成
_tweener.IsComplete();
是否以初始化
_tweener.IsInitialized();
是否正在播放
_tweener.IsPlaying();
返回循環次數,無限循環為Infinity
_tweener.Loops();
11、攜程
private Tweener _tweener;
private void Start()
{
_tweener = transform.DOMove(Vector3.one, 2);
StartCoroutine(Wait());
}
private IEnumerator Wait()
{
yield return ;
}
等待動畫執行完
yield return _tweener.WaitForCompletion();
等待指定的循環次數
//參數為執行次數,等待傳入的循環次數后,繼續執行
//若是傳入的次數大於動畫的循環次數 則在動畫結束時繼續執行
yield return _tweener.WaitForElapsedLoops(2);
等待動畫被殺死
yield return _tweener.WaitForKill();
等待動畫執行指定時間
//參數為時間,動畫執行傳入的時間之后或動畫執行完畢,繼續執行
yield return _tweener.WaitForPosition(0.5f);
等待動畫回退
//以下情況會繼續執行函數
//使用DORestart重新播放時
//使用Rewind倒播動畫完成時
//使用DOFlip翻轉動畫完成時
//使用DOPlayBackwards反向播放動畫完成時
yield return _tweener.WaitForRewind();
等待Start執行后繼續執行
yield return _tweener.WaitForStart();
12、路徑動畫
DOPath的一個使用小案例
在面板中創建如圖的Cube,並如圖擺放
給最上面那個Cube掛載腳本,把下面所有Cube賦值給腳本屬性。
public class CubeText : MonoBehaviour
{
public Transform[] pointList;
private void Start()
{
var position = pointList.Select(u => u.position).ToArray();
transform.DOPath(position, 5, PathType.Linear).SetOptions(true).SetLookAt(new Vector3(0, 0, 0);
}
}
路徑動畫中DOPath的六個參數
//參數1 waypoints: 是提供路徑上點的坐標,需要按順序添加進數組
//參數2 duration:路徑動畫的整體持續時間
//參數3 pathType:路徑類型(就是點於點之間路徑連線的生成方式)
//Linear:直線
//CatmullRom:曲線
//參數4 pathModel: 路徑模式(用於確定正確的LookAt方向)
//Ignore:忽略此參數和設置的LookAt參數
//Full3D:在3d場景下,代表物體可以看向任何方向
//TopDown2D:代表物體只能上下旋轉,看向物體
//Sidescroller2D:代表物體只能左右旋轉看向物體
//參數5 resolution:路徑分辨率(默認10),代表路徑點之間的曲線由多少個點構成,也就是點越多,曲線就越圓,此參數在直線路徑類型下無效
//參數6 gizmoColor:在Scene視圖中,生成的路徑曲線的顏色
SetOptions(closePath, lockPosition, lockRotation)
//參數1 closePath:是否是封閉路徑,設為true的話,會形成閉環,最后運動回起點
//參數2 lockPosition:鎖定位置,參數為軸向,例如,填入AxisConstraint.X的話,橫向的位移將被鎖定,物體只能在其他方向上移動
//參數3 lockRotation:鎖定旋轉,參數為軸向,和鎖定位置同理,鎖定的軸向不能旋轉
SetLookAt()
//參數1 closePath:是否是封閉路徑,設為true的話,會形成閉環,最后運動回起點
//參數2 lockPosition:鎖定位置,參數為軸向,例如,填入AxisConstraint.X的話,橫向的位移將被鎖定,物體只能在其他方向上移動
//參數3 lockRotation:鎖定旋轉,參數為軸向,和鎖定位置同理,鎖定的軸向不能旋轉
//參數4 lookAhead參數:取值范圍0-1
0:看向路徑的前方
0.99:看向路徑的后方
(1)closePath為false (運動最后,物體的朝向移動是路徑的運動方向的前方)
lookAhead = 0:目標會沿着路徑看向前方
lookAhead != 0:目標會按照參數,決定開始運動時的朝向,但是運動期間會勻速轉動朝向,最后朝向會轉回路徑前方的朝向
(2)closePath為true(開始時確定方向后就不會變化了)
lookAhead = 0:目標會沿着路徑看向前方
lookAhead >0 && lookAhead <1:一直保持開始時的方向(即如上圖所示)
lookAhead = 1:這個時候,SetLookAt沒有效果,即物體不會改變朝向
這里所說的朝向是相對於運動路徑的朝向
路過的大神給出的學術性的解釋:
lookAhead 參數的意思就是 看前看的偏移量
假設整個路徑normalize. 即開始點為0,結束點為1. 走到路程的一半即為0.5.
所以如果lookAhead = 0.5 時, 假設當前Transform行走進程到 0.1的位置,則會 LookAt 行走進程 0.6的位置.
如果closePath=true, 則 lookAtPercent = Mathf.Repeat(movePercent + lookAhead, 1);
否則closePath=false, 則 lookAtPercent = Mathf.Clamp01(movePercent + lookAhead);