一般在Unity中動(dòng)畫的表示可以用state也可以用clip牍白,state側(cè)重于狀態(tài)機(jī)脊凰,而clip側(cè)重于動(dòng)畫片段。而我們?cè)讷@取中一般常用的有三個(gè)方法淹朋。
- AnimationClip an = ani.runtimeAnimatorController.animationClips[0];
//獲取該animator的所有的clips笙各,后邊的下標(biāo)可以獲取指定索引值的clip,
下標(biāo)是根據(jù)加入的前后順序 去判斷的础芍,這個(gè)是不區(qū)分層級(jí)杈抢,不區(qū)分動(dòng)畫的狀態(tài) - animator.GetCurrentAnimatorClipInfo(0);
//參數(shù)是表示層級(jí),獲取當(dāng)前層級(jí)播放的動(dòng)畫仑性,返回一個(gè)數(shù)組惶楼,
只有在獲取到的是blendtree的時(shí)候數(shù)組長(zhǎng)度才會(huì)是>1的(blendtree中正在播放的動(dòng)畫有幾個(gè)這個(gè)長(zhǎng)度就是幾) - ani.GetCurrentAnimatorStateInfo(0);
//參數(shù)是表示層級(jí),返回的當(dāng)前層級(jí)正在播放的動(dòng)畫的狀態(tài)機(jī)
上邊的三個(gè)方法比較容易理解诊杆,在這里我就不做過多解釋了歼捐,下邊給大家提一個(gè)問題,當(dāng)兩個(gè)動(dòng)畫狀態(tài)機(jī)之間有連線晨汹,當(dāng)這個(gè)動(dòng)畫播放到兩個(gè)動(dòng)畫的融合處的時(shí)候豹储,那此時(shí)animator.GetCurrentAnimatorClipInfo(0)獲得長(zhǎng)度是1還是2呢?如下圖這種情況
我也是偶然才涉及到了這個(gè)問題淘这,因?yàn)槲蚁朐诓シ舠tand的時(shí)候把stand到rest之間的trigger設(shè)置為true剥扣,我把是否有退出時(shí)間也勾掉了,根據(jù)上邊的Debug.Log("Times")剛開始以為會(huì)輸出一次铝穷,但是經(jīng)過測(cè)試卻發(fā)現(xiàn)他輸出了4次钠怯,郁悶好久,但是后來經(jīng)過測(cè)試曙聂,發(fā)現(xiàn)其實(shí)ani.GetCurrentAnimatorStateInfo(0)的這個(gè)方法在動(dòng)畫播放到上圖橢圓中的那個(gè)狀態(tài)的時(shí)候用該方法獲取的還是stand這個(gè)state晦炊,而animator.GetCurrentAnimatorClipInfo(0)這個(gè)方法在獲取的長(zhǎng)度一直為1,這其中就表明了在動(dòng)畫播放到橢圓的區(qū)域中時(shí)宁脊,用這兩種方法獲取的有且只有一個(gè)state断国,那就是上一個(gè)state,上邊我寫的那個(gè)方法在我們把trigger設(shè)置為true的時(shí)候他會(huì)立馬進(jìn)入到橢圓部分區(qū)域榆苞,而Times輸入了四次這個(gè)其實(shí)是跟他們?nèi)诤喜糠值拈L(zhǎng)度有關(guān)
此時(shí)的Times只輸出了一次
這里Times輸出了3次并思,這個(gè)大家可以去測(cè)試。
而上邊的問題怎么完美解決呢语稠?這是我寫的代碼在里邊加了一個(gè)開關(guān)宋彼。
if (ani.GetCurrentAnimatorStateInfo(0).IsName("stand"))
{
if (!IsSetRest)
{
ani.SetTrigger("Rest");
Debug.Log("Times");
IsSetRest = true;
}
}
除了這個(gè)辦法我們還可以通過另外一種方式去設(shè)置ani.GetNextAnimatorStateInfo(0)弄砍,我們當(dāng)前狀態(tài)機(jī)后邊只連了一個(gè)動(dòng)畫的時(shí)候用IsName(string Name),如果后邊跟了多個(gè)動(dòng)畫我們可以用IsTag(String Tag)這兩個(gè)方式來進(jìn)行判斷输涕,當(dāng)然這種也是有限制的音婶,比如當(dāng)前狀態(tài)機(jī)運(yùn)行兩個(gè)動(dòng)畫融合的部分才可以,否則ani.GetNextAnimatorStateInfo(0)為空莱坎,所以有的時(shí)候就需要我們?nèi)ヅ袛嗍欠癜袶as Exit Time勾去掉衣式,這里就不寫代碼了。
這個(gè)就是寫動(dòng)畫標(biāo)簽的地方檐什。
個(gè)人只見碴卧,有些地方可能有BUG,歡迎大家指出乃正。