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("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();

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

源碼下載


免責聲明!

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



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