AssetLoaders
Coding Style wiki
AssetLoaders 是 AssetLoader 模組的資源載入統一入口(Facade),整合 Unity 原生 Resources 與 Bundle (YooAsset) 雙軌載入,涵蓋場景、一般資源(Asset)與原生檔案(RawFile)的同步/非同步載入、預載、實例化、卸載與釋放,並提供以 groupId 為單位的群組(GroupCacher)批次管理,底層皆以引用計數管理快取。
| 命名空間 | OxGFrame.AssetLoader |
| 類型 | public static class |
| 原始碼 | AssetLoaders.cs |
using OxGFrame.AssetLoader;
注意 使用 Bundle 載入前,須先於場景中建置 PatchLauncher 並完成 Package 初始化(參考 AssetLoader 介紹與 AssetPatcher)。
快速上手
// 載入並實例化 Prefab(Bundle 資源使用 Address 名稱)
var player = await AssetLoaders.InstantiateAssetAsync<GameObject>("PlayerUI");
// 從 Resources 載入資源(res# 前綴 + Resources 相對路徑)
var icon = await AssetLoaders.LoadAssetAsync<Texture2D>("res#Textures/PlayerIcon");
// 批次預載資源,之後載入直接命中快取
await AssetLoaders.PreloadAssetAsync<GameObject>(new string[] { "PlayerUI", "EnemyUI" });
// 載入 Bundle 場景(Additive 疊加)
await AssetLoaders.LoadAdditiveSceneAsync("BattleScene");
// 載入原生檔案內容(僅支援 Bundle)
string json = await AssetLoaders.LoadRawFileAsync<string>("GameConfig");
// 卸載資源(與載入成對呼叫,維持引用計數正確)
AssetLoaders.UnloadAsset("PlayerUI");
通用規則
資源名稱前綴
assetName 支援前綴解析,依前綴決定資源載入來源:
| 前綴 | 說明 | 範例 |
|---|---|---|
| res# | 從 Unity 原生 Resources 載入資源(依 Resources 相對路徑)。 | res#Prefabs/PlayerUI |
| 無前綴 | 預設從 Asset Bundle (YooAsset) 載入資源(直接使用可尋址名稱 Address)。 | PlayerUI |
- 場景與**原生檔案(RawFile)**方法僅支援 Bundle 載入,不支援
res#前綴(RawFile 傳入res#將輸出錯誤日誌)。 - Build Settings(Scenes In Build)場景的
build#前綴由CoreFrames.USFrame場景系統處理,AssetLoaders不支援。
資源包 (Package)
Bundle 載入相關方法皆提供 packageName 多載:
- 未指定
packageName:自動使用預設 Package(AssetPatcher.GetDefaultPackageName())。 - 指定
packageName:從指定的 Package 載入資源,適用於多 Package 分包管理(App/DLC Package 概念與 PlayMode 說明請參考 AssetPatcher 通用規則)。
YooAsset 版本相容性
自 v3.7.0 起同時支援 YooAsset 2.x 與 3.x:依安裝版本自動定義 YOOASSET_2 / YOOASSET_3,公開 API 簽名完全一致,專案程式碼無需修改(如原生檔案於 v3 內部改以 RawFileObject 載入,行為一致)。完整差異對照參考 AssetPatcher › YooAsset 版本相容性。
引用計數與卸載
注意- 每次
Load/Instantiate成功都會使該資源的快取引用計數 +1;Unload使計數 -1,計數歸零時才實際釋放並移出快取。 Preload僅將資源載入至快取(計數為 0),不增加引用計數;已在快取中的資源會跳過預載。forceUnload = true時略過引用計數直接釋放。Release系列方法(ReleaseAssets/ReleaseScenes/ReleaseRawFiles)強制釋放全部快取,僅適合關卡切換或遊戲關閉等時機。- 若資源正在載入中呼叫卸載,卸載請求會排入佇列,待載入完成後依序執行。
重要 Instantiate 系列產生的實例物件銷毀時不會自動歸還引用計數。對於 Bundle 資源,建議 Unload 與 Destroy 成對呼叫,而非只銷毀物件,以維持引用計數的正確性。
載入重試
載入失敗時會自動重試,重試上限由 maxRetryCount 參數控制(預設 MAX_RETRY_COUNT = 3);重試耗盡後輸出警告日誌並回傳 null(或 default)。場景載入的重試次數固定為 1,不受參數控制。
進度回呼 (Progression)
public delegate void Progression(float progress, float currentCount, float totalCount)
| 參數 | 型別 | 說明 |
|---|---|---|
| progress | float | 總進度(currentCount / totalCount,0~1)。 |
| currentCount | float | 當前進度數量。批次預載時為已完成的資源數;單一載入時為載入進度(0~1)。 |
| totalCount | float | 總數量。批次預載時為資源總數;單一載入時為 1。 |
LoadType 列舉
批次釋放方法以 LoadType 指定處理的快取來源:
| 值 | 說明 |
|---|---|
Any | 同時處理 Resources 與 Bundle 快取。 |
Resources | 僅處理 Resources 快取。 |
Bundle | 僅處理 Bundle 快取。 |
場景載入
提供 Bundle 場景的同步/非同步載入,支援 Single(替換當前場景)與 Additive(疊加場景)模式;Additive 場景以堆疊計數管理,需手動卸載。
方法總覽
場景載入
| 方法 | 說明 |
|---|---|
| LoadSceneAsync | 非同步載入 Bundle 場景(完整參數版本)。 |
| LoadScene | 同步載入 Bundle 場景。 |
| LoadSingleSceneAsync | 非同步以 Single 模式載入場景(快捷方法)。 |
| LoadSingleScene | 同步以 Single 模式載入場景(快捷方法)。 |
| LoadAdditiveSceneAsync | 非同步以 Additive 模式疊加載入場景(快捷方法)。 |
| LoadAdditiveScene | 同步以 Additive 模式疊加載入場景(快捷方法)。 |
場景卸載
| 方法 | 說明 |
|---|---|
| UnloadScene | 卸載 Additive 場景(可選擇是否遞迴卸載全部堆疊實例)。 |
| ReleaseScenes | 強制釋放所有 Additive 場景快取。 |
LoadSceneAsync
public static async UniTask<BundlePack> LoadSceneAsync(string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
public static async UniTask<BundlePack> LoadSceneAsync(string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, LocalPhysicsMode localPhysicsMode = LocalPhysicsMode.None, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
public static async UniTask<BundlePack> LoadSceneAsync(string packageName, string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
public static async UniTask<BundlePack> LoadSceneAsync(string packageName, string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, LocalPhysicsMode localPhysicsMode = LocalPhysicsMode.None, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 場景資源名稱(Address;僅支援 Bundle 場景)。 |
| loadSceneMode | LoadSceneMode | 場景載入模式(Single 替換當前場景/Additive 疊加場景)。預設值: LoadSceneMode.Single |
| localPhysicsMode | LocalPhysicsMode | 場景的本地物理模式(是否建立獨立的 2D/3D 物理場景)。 預設值: LocalPhysicsMode.None |
| activateOnLoad | bool | 載入完成後是否立即啟用場景。false 時載入完成後暫緩啟用,之後可透過回傳的 BundlePack.UnsuspendScene() 啟用。預設值: true |
| priority | uint | YooAsset 非同步載入優先權(僅對 Bundle 載入生效)。 預設值: 100 |
| progression | Progression | 載入進度回呼。 預設值: null |
回傳值
UniTask<BundlePack> — 場景包裝物件(內含 YooAsset SceneHandle,可透過 GetScene() 取得 Scene、UnsuspendScene() 解除暫緩);載入失敗時回傳 null。
說明
非同步載入 Bundle 場景。
注意Single模式載入成功後,內部的 Additive 場景計數快取會全部清空(先前的場景由 Unity 自動卸載)。Additive模式可重複載入同名場景,內部以堆疊計數(名稱#序號)管理,需以 UnloadScene 手動卸載。Single模式對同名場景具有防重複載入處理:載入中重複呼叫會等待同一個載入任務完成。
提醒 此方法的多載僅以第三個參數型別(bool 或 LocalPhysicsMode)區分,省略後續參數的簡短呼叫可能造成多載解析模稜兩可(編譯錯誤),建議一般情境改用 LoadSingleSceneAsync/LoadAdditiveSceneAsync,或明確傳入足夠的參數。
範例
// 完整指定參數,載入主場景並暫緩啟用
var pack = await AssetLoaders.LoadSceneAsync("MainScene", LoadSceneMode.Single, LocalPhysicsMode.None, activateOnLoad: false);
// 適當時機再啟用場景
pack.UnsuspendScene();
LoadScene
public static BundlePack LoadScene(string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, Progression progression = null)
public static BundlePack LoadScene(string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, LocalPhysicsMode localPhysicsMode = LocalPhysicsMode.None, Progression progression = null)
public static BundlePack LoadScene(string packageName, string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, Progression progression = null)
public static BundlePack LoadScene(string packageName, string assetName, LoadSceneMode loadSceneMode = LoadSceneMode.Single, LocalPhysicsMode localPhysicsMode = LocalPhysicsMode.None, Progression progression = null)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 場景資源名稱(Address;僅支援 Bundle 場景)。 |
| loadSceneMode | LoadSceneMode | 場景載入模式。 預設值: LoadSceneMode.Single |
| localPhysicsMode | LocalPhysicsMode | 場景的本地物理模式。 預設值: LocalPhysicsMode.None |
| progression | Progression | 載入進度回呼。 預設值: null |
回傳值
BundlePack — 場景包裝物件;載入失敗時回傳 null。
說明
同步載入 Bundle 場景,行為同 LoadSceneAsync(無 activateOnLoad 與 priority 參數)。
LoadSingleSceneAsync
public static async UniTask<BundlePack> LoadSingleSceneAsync(string assetName, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
public static async UniTask<BundlePack> LoadSingleSceneAsync(string packageName, string assetName, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 場景資源名稱(Address;僅支援 Bundle 場景)。 |
| activateOnLoad | bool | 載入完成後是否立即啟用場景。 預設值: true |
| priority | uint | YooAsset 非同步載入優先權。 預設值: 100 |
| progression | Progression | 載入進度回呼。 預設值: null |
回傳值
UniTask<BundlePack> — 場景包裝物件;載入失敗時回傳 null。
說明
以 Single 模式(替換當前場景)非同步載入場景的快捷方法,等同呼叫 LoadSceneAsync 並固定 loadSceneMode = LoadSceneMode.Single、localPhysicsMode = LocalPhysicsMode.None。
範例
await AssetLoaders.LoadSingleSceneAsync("MainScene");
LoadSingleScene
public static BundlePack LoadSingleScene(string assetName, Progression progression = null)
public static BundlePack LoadSingleScene(string packageName, string assetName, Progression progression = null)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 場景資源名稱(Address;僅支援 Bundle 場景)。 |
| progression | Progression | 載入進度回呼。 預設值: null |
回傳值
BundlePack — 場景包裝物件;載入失敗時回傳 null。
說明
以 Single 模式同步載入場景的快捷方法。
LoadAdditiveSceneAsync
public static async UniTask<BundlePack> LoadAdditiveSceneAsync(string assetName, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
public static async UniTask<BundlePack> LoadAdditiveSceneAsync(string packageName, string assetName, bool activateOnLoad = true, uint priority = 100, Progression progression = null)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 場景資源名稱(Address;僅支援 Bundle 場景)。 |
| activateOnLoad | bool | 載入完成後是否立即啟用場景。 預設值: true |
| priority | uint | YooAsset 非同步載入優先權。 預設值: 100 |
| progression | Progression | 載入進度回呼。 預設值: null |
回傳值
UniTask<BundlePack> — 場景包裝物件;載入失敗時回傳 null。
說明
以 Additive 模式(疊加場景)非同步載入場景的快捷方法。可重複載入同名場景,內部以堆疊計數管理,需以 UnloadScene 手動卸載。
範例
// 疊加載入戰鬥場景
await AssetLoaders.LoadAdditiveSceneAsync("BattleScene");
// 戰鬥結束後卸載
AssetLoaders.UnloadScene("BattleScene");
LoadAdditiveScene
public static BundlePack LoadAdditiveScene(string assetName, Progression progression = null)
public static BundlePack LoadAdditiveScene(string packageName, string assetName, Progression progression = null)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| packageName | string | 資源包名稱。未指定時,使用預設 Package。 |
| assetName | string | 場景資源名稱(Address;僅支援 Bundle 場景)。 |
| progression | Progression | 載入進度回呼。 預設值: null |
回傳值
BundlePack — 場景包裝物件;載入失敗時回傳 null。
說明
以 Additive 模式同步載入場景的快捷方法。
UnloadScene
public static void UnloadScene(string assetName, bool recursively = false)
參數
| 參數 | 型別 | 說明 |
|---|---|---|
| assetName | string | 場景資源名稱。 |
| recursively | bool | 是否遞迴卸載同名場景的所有堆疊實例。false 時僅卸載最後載入的一個(後進先出)。預設值: false |
說明
卸載 Additive 場景。同名場景的堆疊計數歸零時,將連動 YooAsset 嘗試釋放未使用的資源。
注意 僅能卸載以 Additive 模式載入的場景;對 Single 場景或查無記錄的名稱呼叫將輸出錯誤日誌(Single 場景於切換時由 Unity 自動卸載)。
ReleaseScenes
public static void ReleaseScenes()
說明
強制卸載所有 Additive 場景並清空堆疊計數快取,最後呼叫 Resources.UnloadUnusedAssets() 進行資源回收。
重要 此操作會釋放全部 Additive 場景,請於確認不再需要時(如關卡整體切換)呼叫。