Unity Dotween常用方法詳解

Dotween是unity裏非常常用的插件,下面我就針對一些相對常用的方法,做下總結:

一、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) Material拓展方法

<1> 改變顏色

//material
Material material = GetComponent<MeshRenderer>().material;
material.SetColor("_Color", Color.red);//修改_Color值爲red

這個的基礎是物體的Shader中有Main Color這個屬性的,沒有的話不能改變,是有解決辦法的
material.DOColor(Color.black, 2);

 

<2> 按照shader的屬性名,修改顏色

material.DOColor(Color.clear, "_TintColor", 2);//""中的是顏色的名字

<3> 修改alpha值

material.DOFade(0, 2);
material.DOFade(0, "_TintColor", 2);//默認爲_Color,如果沒有,則需要添寫第二個參數

<4> 顏色漸變 

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

<5> 改變材質offset的值,改變貼圖的UV座標

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);
material.DOBlendableColor(Color.yellow, "_Color", 3);

(3) 相機的拓展方法

 <1> 調整屏幕視角的寬高比 第一個參數是(寬/高)的比值

Camera camera = GetComponent<Camera>();
camera.DOAspect(0.6f, 2);

<2> 改變相機background參數的顏色 

camera.DOColor(Color.red, 2);

<3> 改變相機近切面的值 

camera.DONearClipPlane(1, 2);

 

<4> 改變相機遠切面的值 

camera.DOFarClipPlane(700, 2);

 

<5> 改變相機FOV的值,放大鏡效果 

camera.DOFieldOfView(30, 2);

 

<6> 改變相機正交大小

camera.DOOrthoSize(10, 2);

 

<7> 按照屏幕像素計算的顯示範圍 

camera.DOPixelRect(new Rect(0f, 0f, 800, 500f), 2);

<8> 按照屏幕百分比計算的顯示範圍

camera.DORect(new Rect(0.0f, 0.0f, 0.5f, 0.5f), 2);

<9> 相機震動 

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

(4) Text拓展方法  

Text text = GetComponent<Text>();
text.DOColor(Color.black, 2);//顏色
text.DOFade(0, 2);//透明度
text.DOBlendableColor(Color.black, 2);//顏色混合

第一個參數傳入的內容按照時間,一個字一個字的輸入到文本框中
//.SetEase(Ease.Linear)是按勻速打字
text.DOText("context", 2).SetEase(Ease.Linear);

二、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), 2));

<1> - <3>的效果:

<4> 加入當前動畫 

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

 

<5> 預添加動畫 

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

<7> 回調函數 

1)預添加回調,直接添加到最開始的時候
quence.PrependCallback(PreCallBack);

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

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

private void PreCallBack()
{
    Debug.Log("PreCallBack");
}

private void InsertCallBack()
{
    Debug.Log("InsertCallBack");
}

private void CallBack()
{
    Debug.Log("CallBack");
}
鏈式
transform.DOMove(Vector3.one, 2).SetLoops(-1, LoopType.Yoyo).SetDelay(1).SetRelative();

 (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> 設置自動殺死動畫 

參數:false會緩存,true會直接釋放
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> 設置動畫運動以速度爲基準 

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

<7> 設置動畫ID 

可以調用緩存的動畫
transform.DOMove(Vector3.one, 2).SetId("Id");
DOTween.Play("Id");

<8> 設置是否可回收 

爲true的話,動畫播放完會被回收,緩存下來,爲false播完就直接銷燬
transform.DOMove(Vector3.one, 2).SetRecyclable(true);

<9> 設置動畫爲增量運動 

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

<10> 設置動畫的幀函數 

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

(3) Ease 運動曲線的設置

<1> 以Ease枚舉作爲參數 

Dotween Ease效果演示地址
http://robertpenner.com/easing/easing_demo.html

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

勻速運動
transform.DOMove(Vector3.one, 2).SetEase(Ease.Linear);

<2> 使用AnimationCurve組件當作參數 

 

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

<3> 以回調函數爲參數 

transform.DOMove(Vector3.one * 2, 1).SetEase(MyEaseFun);

返回值是運動距離的百分比 值應爲0~1之間,0爲起點,1爲終點,不然停留的位置不會是目標位置
參數:1、當前動畫運行的時間,2、持續時間
return time / duration : 0-1 (1,1,1) 1
return time / duration + 1 : 1-2 (2,2,2) (3,3,3)
private float MyEaseFun(float time, float duration, float overshootOrAmplitude, float period)
{
    return time / duration + 1;
}

(4) 回調函數 

1)動畫完成回調
transform.DOMove(Vector3.one, 2).OnComplete(() => { Debug.Log("完成"); });

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
List<Tween> list = DOTween.PausedTweens();

2)返回所有真正播放的動畫,沒有則返回null
List<Tween> list = DOTween.PlayingTweens();

3)獲取給定ID的數組
返回滿足條件的動畫數組
第一個參數是動畫的ID
第二個參數是是否只收集正在播放的動畫,因爲DOTween會緩存之前播放過的動畫
List<Tween> list = DOTween.TweensById("id", true);

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

5)收集傳入的對象是否有動畫在活動
第一個參數爲檢測的 (對象 或 ID)
第二個參數爲是否檢測動畫在播放狀態
爲true時,給定對象在播放狀態時,延時狀態也算正在播放 返回true
爲false時,只檢測給定對象是否有動畫(在pause狀態時也算)有則返回true
List<Tween> list = DOTween.IsTweening(transform,true);

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

<二> 實例方法

Tween _tweener = transform.DOMove(Vector3.one, 1).SetLoops(3);

1)表示動畫執行時間的屬性,可讀可寫,是設置動畫的進度
_tweener.fullPosition = 1;//設置動畫的時間點爲1秒

2)表示動畫執行完的次數(包括循環),配合.OnStepComplete(() => { })使用
int num = _tweener.CompletedLoops();

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

4)獲取動畫的持續時間
參數爲true 表示計算循環的時間,無限循環返回Infinity,flase不包括循環的時間
float time = _tweener.Duration(false);//flase返回1,true返回3

5)動畫已播放的時間
參數爲true 表示計算循環的時間
float time = _tweener.Elapsed();//false返回0-1,true返回0-3

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

7)返回動畫區間已用的百分比
單次循環的數值爲0到1
參數爲 是否包含循環 爲true時 返回值是循環總區間的已用百分比 若爲無限循環 返回值爲0
transform.DOMove(Vector3.one, 1).SetLoops(3)  false時總里程爲1,true時總里程爲3
_tweener.ElapsedPercentage(true);

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

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

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

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

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

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

(7) 協程方法 

private Tweener _tweener;

void Start () 
{
    _tweener = transform.DOMove(Vector3.one * 2, 1).SetLoops(3);
    StartCoroutine(Wait());
}

private IEnumerator Wait()
{
    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();
}

三、路徑動畫 

(1) API 

Dotween對於路徑動畫就只提供了兩個方法,一個是針對於世界座標的,一個是針對於局部座標的,本質上沒啥區別,就以世界座標的方法爲例,進行講解 

 

參數講解:
waypoints: 是提供路徑上點的座標,需要按順序添加進數組
duration:路徑動畫的整體持續時間
pathType:路徑類型(就是點於點之間路徑連線的生成方式)
     它內部預定義了兩種類型
      Linear:直線
      CatmullRom:曲線
pathModel: 路徑模式(用於確定正確的LookAt方向)
     它內部定義了四種類型
      Ignore:忽略此參數和設置的LookAt參數
      Full3D:在3d場景下,代表物體可以看向任何方向
      TopDown2D:代表物體只能上下旋轉,看向物體
      Sidescroller2D:代表物體只能左右旋轉看向物體
resolution:路徑分辨率,代表路徑點之間的曲線由多少個點構成,也就是點越多,曲線就越圓,此參數在直線路徑類型下無效
gizmoColor:在Scene視圖中,生成的路徑曲線的顏色 

public Transform[] PointList;//所有的路徑點
void Start () {
    Transform數組轉換成vector數組
    var positions = PointList.Select(u => u.position).ToArray();
    1、路徑點,2、持續時間
    3、路徑的類型,(就是點於點之間路徑連線的生成方式) PathType.Linear代表直線,PathType.CatmullRom代表曲線
    4、路徑模式(用於確定正確的LookAt方向)
    PathMode.Ignore:忽略此參數和設置的LookAt參數
    PathMode.Full3D:沒有限制,在3d場景下,代表物體可以看向任何方向
    PathMode.TopDown2D:代表物體只能上下旋轉,看向物體
    PathMode.Sidescroller2D:代表物體只能左右旋轉看向物體
    5、路徑分辨率,代表路徑點之間的曲線由多少個點構成,也就是點越多,曲線就越圓,此參數在直線路徑類型下無效
    6、在Scene視圖中,生成的路徑曲線的顏色
    transform.DOPath(positions,5,PathType.CatmullRom,PathMode.Full3D,50,Color.blue);
}

(2) 設置選項

 <1> SetOptions

 

closePath:是否是封閉路徑,設爲true的話,會形成閉環,最後運動回起點
lockPosition:鎖定位置,參數爲軸向,例如,填入AxisConstraint.X的話,橫向的位移將被鎖定,物體只能在其他方向上移動
lockRotation:鎖定旋轉,參數爲軸向,和鎖定位置同理,鎖定的軸向不能旋轉

< 2 > SetLookAt

 

這個方法是很重要的方法,它的後兩個參數,是提供看向的軸向,一般很少更改,就不介紹了,主要介紹第一個參數
它針對於第一個參數的改變,有三種重載
  (1)Transform類型參數 lookAtTransform:也就是要看向的物體
  (2)Vector3類型參數 lookAtPosition:也就是要看向的位置
  (3)float類型的參數 lookAhead:一個向路徑的前方看的參數
前兩個很容易理解,就不多說了,主要說一下第三種 lookAhead

lookAhead 參數
限制

這個參數的取值範圍是0到1的
首先說明,它值的變化,產生的效果

這個值的變化,決定了物體開始移動時的朝向

這個參數在不同數值下的效果,受到SetOptions的第一個參數closePath影響

比較通俗的解釋:
(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);

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