2016-01-11 77 views
0

我有一個animatormanager能夠從1動畫創建運行時動畫(開始幀,結束幀和延遲,然後速度計算,將做變形,以後)。我的統一版本是5.3.1f1如何用統一動畫器啓動多個動畫?

一切工作正常,有些東西沒有完成,但是可選的。動畫師可以對請求的動畫進行排隊,以防止當前動畫中斷。

事情是,我只能用一個對象開始1次動畫。啓動下一個動畫的代碼是完全相同的,但沒有任何關係。

事件如果它的2次相同的動畫具有相同的動畫數據 所有的公式都很好並經過測試。

我也有斷點,以確保一切密集調試是在任何時候

罰款有什麼阻止我的其他後開始的動畫2次對象一個上?我沒有任何錯誤或警告。無論我在AnimData結構中放置的設置如何,第一個動畫都能正常工作,但第二次沒有任何事情發生。

這裏是必不可少的:

public int? startAnim(int index) 
{ 
    if(index < animIndex.Count) 
    { 
     startAnim(animIndex[index]); 
    } 
    return null; 
} 

//private because the struct is internal, this make sure the animator keep control of the list. 
private int? startAnim(AnimData animD) 
{ 
    if(locked) 
    { 
     #if UNITY_EDITOR 
     Debug.Log("anim locked"); 
     #endif 

     return null; 
    } 

    //current anim (queue anim) not finished 
    if(endTime > Time.time) 
    { 
     if(canQueue) 
     { 
      addToQueue(animD); 
      return animDataQ.Count; 
     } 
     else 
     { 
      return null; 
     } 
    } 
    else 
    { 
     endTime = Time.time + animD.TotalTime; 
     StartCoroutine(animManager(animD)); 
     return 0; 
    } 

    return null; 
} 

#endregion anim starters 

private IEnumerator animManager(AnimData animData) 
{ 
     animator.speed = Mathf.Abs(animData.calculateSpeed(animLength, AnimType.main, currentKey).Value); 

     //animator.Play(0,0, animData.StartKey/animLength); 
     if(animData.AnimSpeed > 0) 
     { 
      animator.Play(0,0, animData.StartKey/animLength/2); 
     } 
     else 
     { 
      //animator.Play(0,0, (animLength * 2) - (animData.StartKey/animLength)); 
      animator.Play(0,0, (((animLength*2) - animData.StartKey)/(animLength * 2))); 
     } 

      //animator.Play(0,0, (animData.AnimSpeed > 0) ? animData.StartKey/animLength : ((animLength * 2) - (animData.StartKey/animLength))); 

     yield return new WaitForSeconds(animData.Delay); 
     animator.Stop(); 

     yield return null; 

    endAnim(); 

} 


private void addToQueue(AnimData animD) 
{ 
    animDataQ.Enqueue(animD); 
    endTime += animD.TotalTime; 
    queueTime += animD.TotalTime; 
} 

private void endAnim() 
{ 
    if(canQueue && animDataQ.Count > 0) 
    { 
     StartCoroutine(animManager(animDataQ.Dequeue())); 
    } 
} 

感謝您的時間。

回答

0

我找到了解決辦法。 我不想標記它作爲一個可接受的解決方案,因爲它不是「乾淨」在我看來

對於像我的一些特定情況下,動畫師肯定會出現某種問題。

我的解決方案是使用animator.speed = 0而不是animator.stop(); 一切工作即刻與那個小的變化

我會問我的問題到團結論壇,因爲肯定有什麼奇怪的