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