014-DoTween動畫插件學習

DOTween.To(() => myValue, x => myValue = x, new Vector3(0, 0, 10), 2);

1.myValue已在外界聲明;前兩個是兩個lambda表達式,第一個是返回myValue,第二個是將x的值賦給myValue,x是插件自動計算出來的;第三個參數爲目標位置,第四個參數爲時間

DOMove(new Vector3(0, 0, 0), 0.3f);
DOLocalMove(new Vector3(0, 0, 0), 0.3f);
DORotate();
DOLocalRotate();
DORotateQuaternion();
DOLookAt();
DOScale();
DOPunchPosition();
DOPunchRotation();
DOPunchScale();

2.生成並播放一個動畫,第一個參數是目標位置,第二個參數是用時;下面的是按照局部座標來;一般是在Transform類對象下調用;關於旋轉的方法,第一個是目標角(用Vector3變量表示,也可以用四元數),第二個是時間;DOLookAt方法一般兩個參數,第一個表示看向的點,第二個表示時間;DOScale方法第一個參數爲一個Vector3變量,表示三個方向的縮放,第二個參數時間;DOPunch類方法以Position舉例,效果是物體震動,一般有三個參數,第一個是震動的目標位置,第二個是持續時間,第三個是震動的頻率,若有第四個參數,則表示相反方向震動的幅度,爲0-1之間的值(0的話向相反方向運動時不會超過其原來位置);其它相同類方法同理

SetAutoKill();

3.Tweener對象的方法,設置動畫播放完後是否自動銷燬,默認爲true,設置爲false後播放完的動畫將會處於暫停狀態

Pause();
Play();

4.Tweener對象的方法,設置動畫暫停

DOPlay();
DOPause();
DORestart();
DORewind();
DOSmoothRewind();
DOKill();
DOFlip():
DOGoto();
DOPlayBackwards();
DOPlayForward();
DOTogglePause();

5.第一個將所綁定對象上的所有動畫播放;如在Transform類對象下調用,綁定即生成時綁定在觸發的對象上;第二個一般用於將暫停播放的動畫繼續播放;第三個動畫重新播放;第四個動畫倒放,倒是是一瞬間倒放完;第五個倒放,但能看到過程;第六個銷燬當前對象所有動畫;第七個動畫倒放,但執行的時間要在動畫還沒播完或者剛好播完時纔有效果;第八個用於直接跳轉到動畫播放的某個時間點,有兩個參數,第一個是動畫播放的時間點,第二個是跳轉後是否繼續播放;第九個倒放;第十個正放,與DOPlay的區別在於DOPlay只能播一次,而這個方法配合上面的倒放方法可以實現多次播放;第十一個若當前動畫爲暫停,則播放,若爲播放則暫停

DOMoveX(5, 4);
DOMoveX(5, 4).From(true);
DOMoveX(5, 4).From(false);

6.一般綁定在Transform類對象上;第一個是從當前位置移動到x爲5的位置;第二個是從5+當前位置移動到當前位置;第三個是從5移動到當前位置;第二參數都是表示時間

transform.DOMoveX(4, 1).OnComplete(MyCallback);
transform.DOMove(new Vector3(4, 4, 4), 2).OnComplete(() => { MyCallBack(5); });
OnKill();
OnPlay();
OnStart();
OnPause();
OnStepComplete();
OnUpdate();
OnRewind();

7.第一個當動畫播放完後執行括號裏的方法,若方法含參,則需要用lambda表達式;第二個方法,當銷燬這個動畫後執行括號內方法;第三個方法,當動畫播放時執行相應方法;第四個方法,當動畫第一次播放時執行相應方法;第五個方法,當動畫暫停時執行相應方法;第六個方法,若動畫有周期性動作,如在兩個位置之間反覆移動多次,則每一步移動完後都會觸發括號中方法;第七個方法,用於在動畫幀中執行方法;第八個方法,觸發時機較多,一般用於動畫重新播放時觸發,其它細節不再討論

DOText(“xxxxxxxxxxxxxxx", 4);

8.DOText,將參數中的字符在4秒內逐個顯示完畢;Text類對象的方法

DOShakePosition(1);
DOShakePosition(1, new Vector3(0, 3, 3));

9.震動方法,第一個參數爲震動時間;第二個參數爲力度和方向,默認是xyz都晃動1單位的距離;第二個種寫法是隻在y和z軸震動3單位的距離;Transform類對象的方法;若有第三個參數則表示震動頻率(該方法一般用於攝像機震動以營造打擊特效);其它DOShake方法相似

DOColor(Color.red, 2);
DOFade(1, 3);
//也可以用第一種方法,通過Color.clear來實現漸隱效果
DOColor(Color.red, "Name", 2);//改變材質顏色時,若材質沒有Main Color屬性,用DOTween可以通過該方法實現
SetColor("Name", Color.red);//用Unity自帶的方法實現

10.第一個是將顏色在2秒內變化爲紅色;第二個是將透明度在3秒內變爲1

private DOTweenAnimation tweenAni;

11.可視化動畫編輯器,需要用GetComponent獲取後才能在代碼中使用其功能(與上面的API差不多)

DOPlay註冊在按鈕上,繼續播放動畫
DOTogglePause註冊按鈕上,可以實現用按鈕播放和暫停
DORestart註冊在按鈕上,每次點擊按鈕,都將重新播放動畫

12.路徑編輯器的方法,註冊在按鈕上是指將路徑編輯器所掛物體註冊在按鈕上

DOBlendableMoveBy();

13.參數一般兩個,第一個表示目標位置與當前位置的差,第二個表示時間;與DOMove不同的是該方法是表示增量,而不是固定目的地;其它Blendable類方法相似;

public Gradient _gradient;
Material material = GetComponent<MeshRenderer>().material;
material.DOGradientColor(_gradient, "_TintColor", 2);

14.Unity自帶的漸變編輯器,通過在編輯器界面設置好變化之後,通過如上代碼的方式即可實現播放;上面第二個參數是因爲所選材質沒有Main Color屬性,用一些其它方法修改該材質的顏色時也需要指定第二個參數

DOOffset();
DOVector(Color.red, "Name", 2);

15.第一個方法用來改變材質的offset屬性的,第二個是用來實現四維向量值的漸變的,如改變顏色時也可以用這個方法

Camera camera;
camera.DOAspect();
camera.DOColor();
camera.DONearClipPlane();
camera.DOFarClipPlane();
camera.DOFieldOfView();
camera.DOOrthoSize();
camera.DOPiexlRect();
camera.DORect();
camera.DOShakePosition();

16.第一個方法是用來改變相機視野寬高比的,第一個參數爲寬高比,第二個參數爲時間;第二個方法時改變相機背景顏色的,第一個參數爲目標顏色,第二個參數爲時間;第三個和第四個方法是用來改變相機近切面和遠切面的,第一個參數爲目標值,第二個參數爲時間;第五六個方法分別是改變相機視域的方法,第五個用於透視視野,第六個是正交視野;第一個參數爲目標值,第二個參數爲時間;可以實現物體的方法和縮小;第七八個方法是用來實現相機分屏的,所不同的是第一個方法是以像素爲單位分屏,第二個是以百分比爲單位分屏;第一個參數爲一個Rect,前兩個值表示起點座標,後兩個值分別表示寬度和高度,需要注意的是第一個方法後兩個值要輸計算好的像素,第二個方法的後兩個值要寫0-1之間的數,表示百分比;第二個參數表示時間;第九個方法是讓相機晃動以實現屏幕晃動,第一個參數是時間,第二個參數是振動的力度,第三個參數是震動頻率

DOTween.Sequence().Append();
Sequence quence = DOTween.Sequence();
quence.Append(transform.DOMove(Vector3.one, 2));
quence.AppendInterval(1);
quence.Insert(6, transform.DOMove(-Vector3.one, 1));
quence.Join(transform.DOScale(Vector3.one*2, 2));
quence.PrependInterval(1);
quence.Prepend(transform.DOMove(-Vector3.one*2, 2));
quence.PrependCallback(CallbackName);
quence.InsertCallback(5, CallbackName);
quence.AppendCallback(CallbackName);

17.前兩個方法都是聲明隊列用的,其中第二個比較通用,因爲能得到具體的對象,便於以後用;第三個方法表示向隊列中插入一個動畫,參數爲一個DOTween動畫;第四個方法表示暫停一秒,參數爲暫停的時間;第五個方法表示向具體時間點插入動畫,參數第一個是時間點,第二個是動畫,注意這裏的時間點是隻計算DOTween動畫的時間的;在隊列中的動畫會嚴格按照插入的先後依次播放;第六個方法是與在其之前插入的方法一起播放,當然也可以用Insert方法實現相同功能;第七八九個方法是與原來的插入順序相反的執行方法,即後插入的先執行;第十十一十二個方法是在播放完相應動畫後或在相應的時間點執行指定的回調函數

transform.DOMove(Vector3.one, 2).SetLoops(-1, LoopType.Incremental);
LoopType.Restart;
LoopType.Yoyo;

18.設置動畫的循環參數,-1指無線循環,Incremental是指向一個方向播放,Restart是指播放完一次後再跳回原位置再循環,Yoyo是指來回晃動

transform.DOMove(Vector3.one, 1).SetDelay(1);
transform.DOMove(Vector3.one, 1).SetSpeedBased();
transform.DOMove(Vector3.one, 1).SetId(0);
DOTween.PlayForward(0);
transform.DOMove(Vector3.one, 1).SetRecyclable(false);
transform.DOMove(Vector3.one, 1).SetRelative(true);
transform.DOMove(Vector3.one, 1).SetUpdate(UpdateType.Normal, true);
gameObject.GetComponent<MeshRenderer>().material.DOColor(Color.red, 8f).SetEase(Ease.Flash, 16, 1);
transform.DOMove(Vector3.one, 4f).SetEase(Ease.Linear);
public AnimationCurve _curve;
transform.DOMove(Vector3.one, 2).SetEase(_curve);

19.第一個設置延遲播放時間;第二個是將方法的第二個參數看作速度,每秒1個Unity單位;第三個設置該動畫的Id,可通過下面的方法指定Id播放;第四個是設置該動畫是否爲可回收,默認爲false,設置爲true之後動畫播放完會作爲資源保存;第五個是是否第一個參數爲增量;第六個是設置幀動畫的模式,Normal是正常的模式,後面的bool值表示是否忽略Unity的timeScale;第七個方法可以實現顏色閃動動畫,Ease.Flash表示實現閃動效果,16表示顏色變化次數,最後一個參數取值爲-1到1,正數時變化幅度由大逐漸變小,負數時由小逐漸變大,也可運用於運動方法,如DOMove等,以實現運動規律性變化;第八個方法爲設置運動方式爲勻速;下面兩句,是通過Unity設置好運動方式,在傳遞給DOTween執行,Unity設置界面見下圖:

詳細可以看這個網站:http://robertpenner.com/easing/easing_demo.html

其中橫座標表示時間比例,縱座標表示當前位置與目標位置距離的倍數。上圖所示是一種設置好的運動方式(勻速)

using System.Threading.Tasks;
using System;
async void Start()
{
    await Task.Delay(TimeSpan.FromSeconds(3));
}

20.實現中途暫停3秒再向下執行

var list = DOTween.PausedTweens();//獲取所有暫停動畫
PlayingTweens();//獲取正在播的動畫
TweensById();//第一個參數有三種,整數,字符串,object,獲取當前Id下所有動畫,第二個參數爲是否收集當前正在播放動畫
TweensByTarget();//第一個參數爲一個對象,第二個參數爲是否收集正在播放動畫,返回該對象下所有動畫
IsTweenig();//第一個參數同第三個方法,第二個參數爲是否收集正在播放,返回當前Id下是否有動畫
TotalPlayingTweens();//獲取當前所有正在播放和延遲狀態的動畫
//注意上述方法除第五個外返回的均爲一個數組,如沒有符合條件的,數組爲空,而不是長度爲0
tweener.CompletedLoops();
tweener.fullPosition = 0;
tweener.Elapsed();
tweener.Duration();
tweener.Delay();
tweener.ElapsedDirectionalPercentage();
tweener.ElapsedPercentage();
tweener.IsActive();
tweener.IsBackwards();
tweener.IsComplete();
tweener.IsInitialized();
tweener.IsPlaying();
tweener.Loops();

21.從第六個方法說起,若是tweener動畫設置了循環次數,則該方法會返回該動畫完成了幾次循環;第七個方法設置當前動畫的播放時間點,如上面設置爲0的話,則會重新開始播放;第八個方法爲返回當前已經播放時間,有一個參數爲是否包括循環,若不包括循環,則每一次新的循環執行前時間都會從零開始;第九個方法返回當前動畫的時間,參數同第八個;第十個方法返回動畫的延時;十一個方法,返回當前動畫完成進度的百分比,不計算循環,若有循環,每次循環開始前會清零;第十二個方法返回當前動畫的完成進度,有一個參數,爲是否包括循環,若爲false則與上面的方法相同;第十三個方法返回當前動畫是否還存活;第十四個方法返回當前動畫是否被設爲倒放;第十五個方法返回當前動畫是否已完成;第十六個方法返回當前動畫是否已經初始化;第十七個方法返回當前動畫是否正在播放;第十八個方法返回當前動畫總共循環次數

private Tweener _tweener;
void Start()
{
    _tweener = transform.DOMove(Vector3.one, 1).SetLoops(3);
}
IEnumerator WaitTime()
{
    yield return _tweener.WaitForCompletion();
    yield return _tweener.WaitForElapsedLoops(1);
    yield return _tweener.WaitForKill();
    yield return _tweener.WaitForPosition(1);
    yield return _tweener.WaitForRewind();
    yield return _tweener.WaitForStart();
    Debug.Log("tqt");
}

22.第一個表示當動畫播完後執行後面的方法;第二個表示當執行完第一次循環之後執行後面的方法;第三個表示等待動畫被殺死後執行後面的方法;第四個表示等待動畫執行到1秒時執行後面的方法;第五個同相同方法的回調函數差不多,調用時機比較多,一般是在動畫重新播放後調用後面的方法;第六個表示動畫Start後執行後面的方法,注意一個動畫先Start再Play

public Transform[] posList;
void Start()
{
    var positions = posList.Select(u => u.position).ToArray();
    transform.DOPath(positions, 5, PathType.CatmullRom, PathMode.Full3D, 50, Color.red).SetOptions(true, AxisConstraint.None, AxisConstraint.None).SetLookAt(0);
}

23.路徑動畫的代碼實現:Unity界面:

需要建幾個Cube作爲路徑點,將它們放於Path下;另外我們要移動的Cube放在Path外面,上面的腳本需要掛在它身上,需要注意的是這個Cube也會作爲一個位置點;解釋上面的代碼,var positions = PosList.Select(u => u.position).ToArray();這個利用Linq將posList中的position篩選出來作爲一個數組賦給positions;transform.DOPath(positions, 5, PathType.CatmullRom, PathMode.Full3D, 50, Color.red).SetOptions(true, AxisConstraint.None, AxisConstraint.None).SetLookAt(0);先解釋DOPath,也就是生成路徑的方法,第一個參數是傳入路徑點,第二個參數是動畫時間,第三個參數是設置路徑爲直線或者曲線,上面的爲曲線,第四個參數是設置LookAt的方式的,這裏的Full3D是向整個3D空間中看都可以,Ignore是忽略這個參數和其後的LookAt設置,TopDown2D是隻能向上或者向下,Sidescroller2D是隻能向左右,第五個參數是設置路徑的像素點,第六個參數是設置路徑的顏色;在解釋後面的SetOptions,第一個參數爲路徑是否閉合,第二個參數是用來設置對移動的軸限制的,第三個參數用來設置對旋轉方向的限制;最後再說一下SetLookAt,首先它有三種重載,第一種直接寫一個Vecor3的值,表示物體朝這個點看,第二種直接傳一個物體,表示讓物體朝着這個物體看,第三種是一個0到1之間的數,在閉環情況下,0是物體始終朝着路徑前方,0.5物體的路徑方向會與其視線方向成一個直角,0.9時視線會基本與前進方向相反,但最好不要寫1,1的時候物體的角度將不再改變,若沒有閉環,則物體開始運動時同上面敘述一致,但當最後快要運動完成時物體會自動調整視線與前進方向相同

Ps:一個動畫多次播放時最好不要在中間加非動畫操作但卻能影響動畫效果的語句,如DOMove後又手動設置了位置,下次再通過其它方法調用上面未銷燬DOMove時可能會不執行

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