Unity 動畫系統獲取Animator中動畫的方法與區別

一般在Unity中動畫的表示可以用state也可以用clip,state側重于狀態機,而clip側重于動畫片段。而我們在獲取中一般常用的有三個方法。

  • AnimationClip an = ani.runtimeAnimatorController.animationClips[0];
    //獲取該animator的所有的clips,后邊的下標可以獲取指定索引值的clip,
    下標是根據加入的前后順序 去判斷的,這個是不區分層級,不區分動畫的狀態
  • animator.GetCurrentAnimatorClipInfo(0);
    //參數是表示層級,獲取當前層級播放的動畫,返回一個數組,
    只有在獲取到的是blendtree的時候數組長度才會是>1的(blendtree中正在播放的動畫有幾個這個長度就是幾)
  • ani.GetCurrentAnimatorStateInfo(0);
    //參數是表示層級,返回的當前層級正在播放的動畫的狀態機

上邊的三個方法比較容易理解,在這里我就不做過多解釋了,下邊給大家提一個問題,當兩個動畫狀態機之間有連線,當這個動畫播放到兩個動畫的融合處的時候,那此時animator.GetCurrentAnimatorClipInfo(0)獲得長度是1還是2呢?如下圖這種情況

Paste_Image.png
Paste_Image.png

我也是偶然才涉及到了這個問題,因為我想在播放stand的時候把stand到rest之間的trigger設置為true,我把是否有退出時間也勾掉了,根據上邊的Debug.Log("Times")剛開始以為會輸出一次,但是經過測試卻發現他輸出了4次,郁悶好久,但是后來經過測試,發現其實ani.GetCurrentAnimatorStateInfo(0)的這個方法在動畫播放到上圖橢圓中的那個狀態的時候用該方法獲取的還是stand這個state,而animator.GetCurrentAnimatorClipInfo(0)這個方法在獲取的長度一直為1,這其中就表明了在動畫播放到橢圓的區域中時,用這兩種方法獲取的有且只有一個state,那就是上一個state,上邊我寫的那個方法在我們把trigger設置為true的時候他會立馬進入到橢圓部分區域,而Times輸入了四次這個其實是跟他們融合部分的長度有關

Paste_Image.png

此時的Times只輸出了一次

Paste_Image.png

這里Times輸出了3次,這個大家可以去測試。

而上邊的問題怎么完美解決呢?這是我寫的代碼在里邊加了一個開關。

 if (ani.GetCurrentAnimatorStateInfo(0).IsName("stand"))
    {
        if (!IsSetRest)
        {
            ani.SetTrigger("Rest");
            Debug.Log("Times");
            IsSetRest = true;
        }
    }

除了這個辦法我們還可以通過另外一種方式去設置ani.GetNextAnimatorStateInfo(0),我們當前狀態機后邊只連了一個動畫的時候用IsName(string Name),如果后邊跟了多個動畫我們可以用IsTag(String Tag)這兩個方式來進行判斷,當然這種也是有限制的,比如當前狀態機運行兩個動畫融合的部分才可以,否則ani.GetNextAnimatorStateInfo(0)為空,所以有的時候就需要我們去判斷是否把Has Exit Time勾去掉,這里就不寫代碼了。

Paste_Image.png

這個就是寫動畫標簽的地方。
個人只見,有些地方可能有BUG,歡迎大家指出。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容