天天看點

Unity中Animator動态添加AnimationClip

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("[email protected]");
12         else if (GUI.Button(new Rect(60, 0, 50f, 50f), "Pose02"))
13             UpDateAnimator("[email protected]");
14         else if (GUI.Button(new Rect(120, 0, 50f, 50f), "Pose03"))
15             UpDateAnimator("[email protected]");
16         else if (GUI.Button(new Rect(180, 0, 50f, 50f), "Pose04"))
17             UpDateAnimator("[email protected]");
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();
           

兩行很關鍵,沒有這兩行,會出現錯亂或者記憶體持續增加

源碼下載下傳

轉載于:https://www.cnblogs.com/hnlyfy/p/5846689.html

繼續閱讀