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);