記一次Animator狀態快速切換問題的解決


事情是這樣的,我嘗試在一幀內多次切換一些狀態(當前狀態為Idle的情況下):

public Animator animator;


void OnEnable()
{
    animator.CrossFade("BeAttack1", 0.2f);
    animator.CrossFade("Idle", 0.2f);
}

 

但結果並非播放Idle,而是播放BeAttack1。

在Animator刷新前,它所播放的是最后一次調用接口的信息,誰排在后執行誰。

並且當一個狀態處於過渡時,Animator默認這個狀態還沒有跳轉,只有過渡完成才算跳轉到另一個狀態(具體看這篇:http://www.cnblogs.com/hont/p/4786462.html)

 

下面這幅圖說明了這個問題:

 

 

Animation有一個動畫隊列可以解決這個問題,而Animator取消了動畫隊列。

而用協程的話又會變得非常麻煩,於是我想到了用Animator.Update來解決:

public static void ForceCrossFade(this Animator animator, string name, float transitionDuration, int layer = 0, float normalizedTime = float.NegativeInfinity)
{
    animator.Update(0);

    if (animator.GetNextAnimatorStateInfo(layer).fullPathHash == 0)
    {
        animator.CrossFade(name, transitionDuration, layer, normalizedTime);
    }
    else
    {
        animator.Play(animator.GetNextAnimatorStateInfo(layer).fullPathHash, layer);
        animator.Update(0);
        animator.CrossFade(name, transitionDuration, layer, normalizedTime);
    }
}

 

我寫了一個CrossFade的擴展,強制調用Update,如果當前沒有下一個動畫跳轉則直接混合,如果有就強制切到跳轉然后混合。

調用測試腳本:

void OnEnable()
{
    animator.ForceCrossFade("BeAttack1", 0.2f);
    animator.ForceCrossFade("Idle", 0.2f);
}

 

OK,測試無誤,最后又回到了Idle:

 

注意:ForceCrossFade不能在SMB里的Update中調用,否則會死循環,如果一定要調用需要加一個標記判斷


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM