簡單總結Unity使用Resources類資源管理
阿新 • • 發佈:2019-01-09
最近參考了各位大神的資源,初步學習了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需要花費一定時間去檢索哪些資源沒有被使用才會去解除安裝。使用方便,但不快捷,還要注意哪些資源是否一直被全域性變數引用,導致一直無法釋放。