1. 程式人生 > >簡單總結Unity使用Resources類資源管理

簡單總結Unity使用Resources類資源管理

最近參考了各位大神的資源,初步學習了Unity的資源管理模式,包括在編輯器管理(使用AssetDatabase)和在執行時管理(使用Resources和AssetBundle)。在此簡單總結執行時用Resources類資源管理的方法,方便自己回顧。

  • Resources類只能讀取名為“Resources”的資料夾裡的資源,注意是複數形式。
  • Resources資料夾需要使用者自己新建,可以放在Asset資料夾裡任意層級的子目錄中,若在不同目錄下有多個“Resources”資料夾,載入某個指定資源時每一個“Resources”資料夾都會被檢查。因此建議專案中只建立一個名為“Resources”的資料夾,且放在Asset資料夾的根目錄下。
  • Unity打包釋出時,只有Resources資料夾裡的資源在會被打入包中。
  • Resources類載入資源時,使用”Resources”資料夾開始的相對路徑,且不包含資源的副檔名。如要載入Asset/Resources/Images/1.jpg資源,載入路徑應該寫”Images/1”。

Demo:

using UnityEngine;
using System.Collections;

public class TestResources : MonoBehaviour {

    void Start () {
        /*
        載入資源
        */
        // 預製體返回GameObject型別,路徑不包含拓展名
GameObject go = Resources.Load<GameObject>("Prefabs/Cube"); // 資源在載入後要被例項化才能看到(等於克隆一個出來) GameObject go2 = Instantiate(go); // 載入其他非GameObject型別的資源 Texture2D image = Resources.Load<Texture2D>("Images/1"); // 測試是否載入成功 Debug.Log(image.name); /* 解除安裝資源 */
// 解除安裝非GameObject型別的資源,會將已載入資源及其克隆體剔除 Resources.UnloadAsset(image); // 解除安裝GameObject型別的資源的克隆體 Destroy(go2); #if UNITY_EDITOR // 在編輯器模式下無法解除安裝go物體,否則會報錯讓改用DestroyImmediate(obj, true),但這樣做會連資料夾裡的原始Asset一併刪除! #else DestroyImmediate(go); // 所有該物體的克隆體也都一併被刪除,即本例中的go2物體 #endif } }

總結一下:

  • Resources類的資源載入方式只有一種,但解除安裝方式卻有三種,載入容易解除安裝難。選擇有誤會報錯,甚至會連資料夾裡的原始Asset一併刪除!
  • Resources.UnloadAsset(obj):解除安裝 GameObject型別的資源,會將記憶體中已載入資源及其克隆體解除安裝。
  • Destroy(obj):僅用於解除安裝GameObject型別的資源的克隆體
  • DestroyImmediately(obj):解除安裝GameObject型別的資源,會將記憶體中已載入資源及其克隆體解除安裝,但該方法只能用在非編輯模式下,否則會報錯提示改為DestroyImmediately(obj, true),然而編輯模式下使用該函式會連資料夾裡的原始Asset一併刪除。

官方推薦的解除安裝資源方法是:

public static AsyncOperation UnloadUnusedAssets()

從返回值可以看出這是個非同步操作,即Unity需要花費一定時間去檢索哪些資源沒有被使用才會去解除安裝。使用方便,但不快捷,還要注意哪些資源是否一直被全域性變數引用,導致一直無法釋放。