AnimatorController中一下加載大量動畫,會使游戲內存增大很多,所以想動態增加AnimatorController中的動畫,達到使用那個動畫就加載對應動畫的功能。
研究后發現可以通過AnimatorOverrideController實現。通過替換動畫的方式,用需要播放的動畫將控制器中指定的一個動畫替換,這樣能間接達到動態加載的功能,
1 using UnityEngine; 2 public class test : MonoBehaviour 3 { 4 public Animator m_Animator; 5 public RuntimeAnimatorController m_RuntimeAnimatorController; 6 string mOriginClipName = "play"; 7 8 void OnGUI() 9 { 10 if (GUI.Button(new Rect(0, 0, 50f, 50f), "Pose01")) 11 UpDateAnimator("player@pose01"); 12 else if (GUI.Button(new Rect(60, 0, 50f, 50f), "Pose02")) 13 UpDateAnimator("player@pose02"); 14 else if (GUI.Button(new Rect(120, 0, 50f, 50f), "Pose03")) 15 UpDateAnimator("player@pose03"); 16 else if (GUI.Button(new Rect(180, 0, 50f, 50f), "Pose04")) 17 UpDateAnimator("player@pose04"); 18 else if (GUI.Button(new Rect(0, 60, 50f, 50f), "Stand")) 19 m_Animator.Play("standby"); 20 } 21 22 void UpDateAnimator(string pAnimResourceName) 23 { 24 var tOverrideController = new AnimatorOverrideController(); 25 tOverrideController.runtimeAnimatorController = m_RuntimeAnimatorController; 26 27 var mAnimationClips = Resources.LoadAll<AnimationClip>(pAnimResourceName); 28 if (mAnimationClips.Length <= 0) 29 return; 30 31 tOverrideController[mOriginClipName] = mAnimationClips[0]; 32 m_Animator.runtimeAnimatorController = null; 33 m_Animator.runtimeAnimatorController = tOverrideController; 34 m_Animator.Play(mOriginClipName, 0, 0); 35 Resources.UnloadUnusedAssets(); 36 } 37 }
其中:
m_Animator.runtimeAnimatorController = null; Resources.UnloadUnusedAssets();
兩行很關鍵,沒有這兩行,會出現錯亂或者內存持續增加