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