一、小框架代码整合
资源加载模块中,会把之前已经完成的小框架代码按照功能进行分类整理,放到对应的框架文件夹中。目的主要是:
统一管理代码
明确不同管理器的职责
方便后续项目直接复用
二、资源加载模块中的几个管理器
当前资源加载相关管理器主要包括:
ResMgr→ 加载 Resources 文件夹中的资源
UWQResMgr→ 使用 UnityWebRequest 加载指定路径资源
EditorResMgr→ 编辑器模式下直接加载工程中的资源
ABMgr→ 从 AssetBundle 中加载资源
ABResMgr→ 对 EditorResMgr 和 ABMgr 进一步进行统一封装
其中这一节重点整合的是:
EditorResMgr+ABMgr
三、为什么要整合 EditorResMgr 和 ABMgr
EditorResMgr 主要用于开发阶段直接读取资源。
它的目的之一是:
开发阶段
↓
直接读取工程资源
↓
不用频繁重新打 AssetBundle
↓
方便测试
而真正发布之后,资源通常需要通过:
ABMgr
从 AssetBundle 中加载。因此这两个管理器虽然加载方式不同,但实际上服务的是同一套 AB 资源加载逻辑,所以可以再封装一层统一入口。
四、ABResMgr
定义:
public class ABResMgr : BaseManager<ABResMgr>
ABResMgr 继承:
BaseManager<ABResMgr>
所以它属于普通 C# 单例管理器。
同时构造函数:
private ABResMgr() { }
防止外部直接创建该管理器。
五、isDebug
定义:
private bool isDebug = true;
它用于决定当前资源加载方式。
isDebug = true→ EditorResMgr 加载
isDebug = false→ ABMgr 加载
也就是:
开发测试阶段→ 不需要打 AB 包→ 直接加载工程资源
正式 AB 测试 / 发布阶段→ 从 AssetBundle 加载
六、统一的资源加载接口
对外只提供一个:
public void LoadResAsync<T>(
string abName,
string resName,
UnityAction<T> callBack,
bool isSync = false
) where T : Object
参数:
abName→ AB 包名
resName→ 资源名
callBack→ 资源加载完成后的回调
isSync→ ABMgr 内部加载依赖包时是否同步处理
这样外部不需要关心当前到底使用:
EditorResMgr还是ABMgr
只调用:
ABResMgr.Instance.LoadResAsync<T>()
即可。
七、UNITY_EDITOR 条件编译
代码中使用:
#if UNITY_EDITOR
表示下面的代码只会在:
Unity 编辑器环境
中参与编译。对应结束:
#endif
因此可以做到:
Unity Editor→ 可以使用 EditorResMgr
打包后的程序→ 不包含 EditorResMgr 相关调用→ 直接使用 ABMgr
这也是为什么 EditorResMgr 可以安全地用于开发测试,而不会影响最终发布版本。
八、编辑器模式下的加载逻辑
在 Unity Editor 中:
#if UNITY_EDITOR
if (isDebug)
{
...
}
else
{
...
}
#endif
如果:
isDebug = true
就使用:
EditorResMgr
加载资源。
代码:
T res = EditorResMgr.Instance.LoadEditorRes<T>(
$"{abName}/{resName}"
);
加载完成后:
callBack?.Invoke(res as T);
九、EditorResMgr 的资源路径规则
这里约定:
AB 包名=对应资源文件夹名
所以:
$"{abName}/{resName}"
可以组成资源路径。
例如:
abName = "ui"
resName = "MainPanel.prefab"
拼接后:
ui/MainPanel.prefab
然后交给:
EditorResMgr.Instance.LoadEditorRes<T>()
直接从编辑器工程中读取。
十、编辑器中关闭 Debug
如果:
isDebug = false;
即使当前运行在 Unity Editor 中,也会走:
ABMgr.Instance.LoadResAsync<T>(
abName,
resName,
callBack,
isSync
);
这样可以在编辑器中测试真正的:
AssetBundle 加载流程
所以:
isDebug = true→ 测试游戏逻辑和资源使用
isDebug = false→ 测试实际 AB 加载
十一、发布后的加载逻辑
条件编译:
#else
中的代码:
ABMgr.Instance.LoadResAsync<T>(
abName,
resName,
callBack,
isSync
);
表示最终打包以后,不再判断 isDebug,而是直接使用:
ABMgr
进行资源加载。
整体逻辑:
Unity Editor
│
├─ isDebug = true
│ ↓
│ EditorResMgr
│
└─ isDebug = false
↓
ABMgr
发布后的程序
↓
ABMgr
十二、为什么不整合 ResMgr
ResMgr 专门负责:
Resources 文件夹中的资源
使用它的时候,已经明确知道:
资源就在 Resources 中
因此直接调用 ResMgr 即可。没有必要再通过统一管理器判断该使用哪一种加载方式。
十三、为什么不整合 UWQResMgr
UWQResMgr 专门负责:
指定路径资源
网络资源
本地 file:// 路径资源
例如:
http://
https://
file://
使用它之前,同样已经明确知道:
资源在哪里
以及需要使用 UnityWebRequest
所以和:
Resources
AssetBundle
Editor 直接加载
并不是同一种资源管理场景。
因此没有必要把 UWQResMgr 强行整合进 ABResMgr。
十四、资源加载模块整体结构
整合后可以理解为:
资源加载模块
│
├─ ResMgr
│ └─ Resources 资源加载
│
├─ UWQResMgr
│ └─ UnityWebRequest 指定路径资源加载
│
├─ EditorResMgr
│ └─ Editor 下直接读取工程资源
│
├─ ABMgr
│ └─ AssetBundle 资源加载
│
└─ ABResMgr
├─ Editor 开发阶段
│ └─ EditorResMgr
│
└─ 正式 AB 模式
└─ ABMgr
十五、ABResMgr 加载流程
外部
↓
ABResMgr.Instance.LoadResAsync<T>()
↓
判断当前是不是 Unity Editor
↓
┌────────────────────────────┐
│ Unity Editor │
│ │
│ 判断 isDebug │
│ ↓ ↓ │
│ true false │
│ ↓ ↓ │
│ EditorResMgr ABMgr │
└────────────────────────────┘
正式发布
↓
ABMgr
↓
加载完成
↓
callBack
十六、完整代码
1. ABResMgr.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.Events;
/// <summary>
/// 用于进行加载AB相关资源的整合
/// 在开发中可以通过EditorResMgr加载对应资源进行测试
/// </summary>
public class ABResMgr : BaseManager<ABResMgr>
{
// 如果为true:
// 通过EditorResMgr加载
//
// 如果为false:
// 通过ABMgr以AssetBundle的形式加载
private bool isDebug = true;
private ABResMgr()
{
}
/// <summary>
/// 统一加载AB相关资源
/// </summary>
/// <typeparam name="T">资源类型</typeparam>
/// <param name="abName">AB包名</param>
/// <param name="resName">资源名</param>
/// <param name="callBack">加载完成回调</param>
/// <param name="isSync">
/// ABMgr加载依赖包时是否使用同步方式
/// </param>
public void LoadResAsync<T>(
string abName,
string resName,
UnityAction<T> callBack,
bool isSync = false
) where T : Object
{
#if UNITY_EDITOR
if (isDebug)
{
// 自定义AB资源管理规则:
// 对应文件夹名就是AB包名
T res =
EditorResMgr.Instance.LoadEditorRes<T>(
$"{abName}/{resName}"
);
callBack?.Invoke(res as T);
}
else
{
ABMgr.Instance.LoadResAsync<T>(
abName,
resName,
callBack,
isSync
);
}
#else
ABMgr.Instance.LoadResAsync<T>(
abName,
resName,
callBack,
isSync
);
#endif
}
}
2. Lesson26.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Lesson26 : MonoBehaviour
{
void Start()
{
#region 知识点一 小框架代码整合
// 将之前写的小框架相关代码
// 分门别类地整合在小框架文件夹中
#endregion
#region 知识点二 EditorResMgr和ABMgr整合
// EditorResMgr的主要目的是方便资源管理
// 避免频繁地打AB包进行测试
//
// 它主要是为AB包预备资源服务的
//
// 因此可以把它和ABMgr整合在一起
#endregion
#region 知识点三 为什么不整合ResMgr和UWQResMgr
// 这两种资源加载管理器相对比较独立
//
// ResMgr:
// 专门用于加载Resources下的资源
//
// UWQResMgr:
// 专门用于加载指定位置的资源
//
// 当使用它们时,
// 一般已经确定了资源的位置和加载方式
//
// 因此不需要再进行更多整合
#endregion
}
void Update()
{
}
}

475

被折叠的 条评论
为什么被折叠?



