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 场景,请在确认不再需要时(如关卡整体切换)调用。
缓存查询
查询与获取当前缓存中的资源包装对象。
方法总览
| 方法 | 说明 |
|---|---|
| HasInCache | 检查资源是否已在缓存中。 |
| GetFromCache<T> | 获取缓存中的资源包装对象(ResourcePack/BundlePack)。 |
HasInCache
public static bool HasInCache(string assetName)
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| assetName | string | 资源名称(支持 res# 前缀)。 |
返回值
bool — 资源是否已存在于缓存(依前缀自动判断查询 Resources 或 Bundle 缓存)。
说明
检查资源是否已在缓存中(已预加载或已加载)。
GetFromCache<T>
public static T GetFromCache<T>(string assetName) where T : AssetObject
参数
| 参数 | 类型 | 说明 |
|---|---|---|
| assetName | string | 资源名称(支持 res# 前缀)。 |
返回值
T — 缓存中的资源包装对象;未找到时返回 null。
说明
获取缓存中的资源包装对象。来源为 Resources 时类型为 ResourcePack;来源为 Bundle 时类型为 BundlePack(可进一步通过 GetOperationHandle<T>() 获取 YooAsset 操作句柄)。
示例
var pack = AssetLoaders.GetFromCache<BundlePack>("PlayerUI");
if (pack != null)
Debug.Log($"引用计数: {pack.refCount}");
资源加载 (Asset)
一般资源(Prefab、Texture、AudioClip 等 UnityEngine.Object)的预加载、加载、实例化与卸载,支持 Resources(res#)与 Bundle 双轨。
方法总览
预加载
| 方法 | 说明 |
|---|---|
| PreloadAssetAsync<T> | 异步预加载资源至缓存(支持批量)。 |
| PreloadAsset<T> | 同步预加载资源至缓存(支持批量)。 |