對變量進行動畫
static DOTween.To(getter, setter, to, float duration) getter:lambda表達式 ()=> myValue setter:lambda表達式 (x)=> myValue = x to:最終值 duration:補間時長 例如: DOTween.To(()=> myVector, x=> myVector = x, new Vector3(3,4,8), 1); DOTween.To(()=> myFloat, x=> myFloat = x, 52, 1);
物體的移動和旋轉
移動的方法用法類似只有兩個常用的分別是DOMove()和DOLocalMove(),主要是對世界坐標和局部坐標區分的,當然你也可以對單個軸進行動畫,比如上面的平移操作可以使用DOLocalMoveX();
旋轉常用的就是DORotate(),DOLocalRotate()旋轉三維向量
DORotateQuaternion()旋轉四元數
游戲中常用的DOLookAt(),比自己寫差值方便很多,具體參數可以查看官方例子
public RectTransform panelTransform; private bool isIn = false; void Start() { //panelTransform.DOMove(new Vector3(0, 0, 0), 1);//讓paneltransfrom從當前位置 動畫到 0,0,0的位置 時間為1s (修改的世界坐標) Tweener tweener = panelTransform.DOLocalMove(new Vector3(0, 0, 0), 0.3f);//默認動畫播放完成會被銷毀 //Tweener對象保存這個動畫的信息 每次調用do類型的方法都會創建一個tweener對象,這個對象是dotween來管理 tweener.SetAutoKill(false);// 把autokill 自動銷毀設置為false tweener.Pause();//暫停動畫播放 } public void OnClick() { if (isIn == false) { panelTransform.DOPlayForward();//前放 isIn = true; } else { //讓panel離開屏幕 panelTransform.DOPlayBackwards();//倒放 isIn = false; } }
這個需要注意,ui和3d物體不一樣,他的移動是控制RectTransform,而且ui的坐標都是局部坐標,這里我們因為dotween每次都會自動銷毀,對我們做返回不好,所以使用SetAutoKill(false)不時它銷毀,但是如果放在update方法的話每次執行都會生成一個動畫存放在tweener物體身上,因為不會自動銷毀所以我們需要將它放在start里面生成,然后控制動畫向前播放和向后播放就可以了。
改變物體大小
transform.localScale = Vector3.zero; transform.DOScale(1, 1f);
屏幕震動效果
void Start () { //參數分別是震動時間和相機位移的向量,震動次數和隨機方向,比如我不想讓前后動,就把z軸設置為0 transform.DOShakePosition(1,new Vector3(3,3,0),10,90); }
抖動效果,和震動類似但是可控參數更多
//第一個參數 ,抖動的方向,例如我這里是從當前位置向上抖動到1的位置 //第二個參數,抖動的時間 //第三個參數,抖動的次數 //第四個參數 0-1之間的數,代表回彈的幅度, 假如為零從最高點當前位置+Vector3.up回來的時候只會回到當前位置,如果為一就會回到當前位置-Vector3.up的位置 transform.DOPunchPosition(Vector3.up, 2, 2, 0.5f);
顏色和透明的動畫
普通UI的顏色
private Text text; // Use this for initialization void Start () { text = GetComponent<Text>(); //設置顏色 //text.DOColor(Color.red, 2); //設置透明度 text.DOFade(1, 3); }
3D物體我們通常使用材質球控制顏色和透明度
Material ma = this.GetComponent<MeshRenderer>().material; ma.DOColor(new Color(0.5f, 0.5f, 0.5f, 1), 2);//注意當前材質的shader必須有_Color屬性,如果沒有或者名字不對會報錯,需要給其他的賦值 //例如: ma.DOColor(new Color(0.5f, 0.5f, 0.5f, 1),"_TintColor", 2);//不知道名字的可以通過編輯shader查看
動畫融合-Blend
這個主要是用在兩種同時需要的相同動畫進行融合效果
例如
下面這種情況下dotween會忽略第一行動畫效果直接執行最終的動畫效果
transform.DOMove(new Vector3(0,1,1),2); transform.DOMove(new Vector3(1,2,0),2);
這時候就需要用到我們的Blend動畫融合,DOBlendableMoveBy()這個方法會將這兩個動畫的參數進行融合計算出最終的坐標當成一個動畫進行融合,當然你也可以通過計算兩個點的向量計算最終點的位置使用DOMove()方法進行移動.
transform.DOBlendableMoveBy(new Vector3(0,1,1),2); transform.DOBlendableMoveBy(new Vector3(1,2,0),2);
反向播放-From
void Start () { transform.DOMoveX(5, 3).From(); //默認是從當前位置運行到目標位置 加上From()方法以后表示從目標位置移動到當前位置 transform.DOMoveX(5, 4).From(true); }
from方式就是和直接使用是反方向的,比如第一句代碼不加from方法是想從當前位置運動到5的位置,時間三秒,加上之后就是從5運動到當前位置時間3秒,from方法里面有一個參數,默認為false就是直接從目標位置運動到當前位置,如果改為ture就是相對坐標,也就是從距離5的位置運動到目標位置,假如當前位置是1,就是從1+5也就是6的位置運動到1的位置。
設置動畫曲線,也就是動畫運動的軌跡,以及動畫事件
修改SetEase()這個方法里面的Ease即可
OnComplete是動畫結束需要觸發的事件,可以跟在任何動畫后面
void Start () { Tweener tweener = transform.DOLocalMoveX(0, 2); tweener.SetEase(Ease.OutBounce);//動畫曲線 tweener.OnComplete(OnTweenComplete);//動畫結束事件 tweener.SetLoops(2);//動畫循環次數 } void OnTweenComplete() { Debug.Log("動畫播放完成了"); }
生命周期函數
OnComplete();//綁定事件的函數 Onkill();//動畫被銷毀的時候調用 OnPlay();//動畫播放的時候調用 OnPause();//動畫暫停的時候調用 OnRewind();//動畫被重置的時候 OnStart();//動畫被播放的時候(只會調用一次)
連續動畫-Sequence
如果想執行完第一個之后再執行第二個是不可以使用兩行代碼直接做動畫的,dotween會默認執行第二個動畫,所以我們想要再一個動畫執行完成之后再執行第二個甚至第三個動畫…這樣就要使用OnComplete()或者隊列保存動畫列表挨個執行,一般隊列是調用最方便的,OnComplete()在執行超過兩個動畫的拼接之后會出現莫名錯誤
private void SizeTween () { Sequence quence = DOTween.Sequence(); quence.Append( damageText.rectTransform.DOScale(new Vector3(1.5f,1.5f,1.5f),0.3f)); quence.AppendInterval(1);//兩個動畫之間的延時 quence.Append(damageText.rectTransform.DOScale(new Vector3(1, 1, 1), 1)); }
更多詳解以及使用
Dotween常用方法詳解
https://blog.csdn.net/zcaixzy5211314/article/details/84886663
Dotween Path 路徑動畫使用方法詳解
https://blog.csdn.net/zcaixzy5211314/article/details/84988535
MoveEffectTool工具Github地址
https://github.com/BlueMonk1107/MoveEffectTool
Dotween Ease效果演示地址
http://robertpenner.com/easing/easing_demo.html
