UFL5——资源加载模块

前置知识点

  1. C#中Dictionary​相关知识点(C#四部曲之C#进阶中)
  2. C#中委托事件相关知识点(C#四部曲之C#进阶中)
  3. C#中泛型相关知识点(C#四部曲之C#进阶中)
  4. Unity中特殊文件夹相关知识点(Unity四部曲之Unity基础中)
  5. Unity中协同程序相关知识点(Unity四部曲之Unity基础中)
  6. Unity中UnityWebRequest​相关知识点(Unity网络开发基础中)
  7. Unity中AB包相关知识点(Unity热更新解决方案之Lua)
  8. Unity中AssetDatabase​相关知识点(Unity编辑器拓展中)

资源加载模块

  1. 资源加载模块的主要作用

    方便统一管理各种资源加载卸载方式(Resources​、AB包、UnityWebRequest​、Editor​)
    方便异步加载资源(Resources​、AB包、UnityWebRequest​)

  2. 资源加载模块的基本原理

    将各资源加载模式模块化 方便我们在加载资源时根据自己的需求进行选择性使用

抛出问题

我们目前有相当多的资源加载方案来加载不同文件夹下的资源,而不同类型的资源加载方案能加载的文件夹也不尽相同

image

问题:

  1. 实际开发中,可能会采用多种资源加载模式组合使用,逻辑分散时,不方便管理
  2. 异步加载时,往往会使用协同程序,异步加载资源会产生很多,协同程序相关的冗余代码

资源加载模块的主要作用

  1. 方便统一管理各种资源加载卸载方式(Resources​、AB包、UnityWebRequest​、Editor​)
  2. 方便异步加载资源(Resources​、AB包、UnityWebRequest​)

资源加载模块的基本原理

将各资源加载模式模块化,比如Resources​资源管理器、AB包资源管理器等等
让他们分别管理不同加载方式加载的资源,最终再将他们整合在一起
方便我们在加载资源时根据自己的需求进行选择性使用

Resource资源加载模块

  • Resource资源加载模块

    • Resource资源加载模块的具体实现
    • 优化Resources资源加载模块的异步加载
    • 添加引用计数的Resource资源加载模块
  • Editor资源加载模块

  • Assetbundle资源加载模块

    • AB包资源管理器回顾及潜在问题考虑
    • AB包资源管理器的异步加载修改
    • AB包资源管理器的同步加载修改
  • UnityWebRequest资源加载模块

EditorResManager和ABManager整合

EditorResManager​的主要目的是方便资源管理,避免频繁的打AB包进行测试,
它主要是为AB包预备资源服务的,因此我们可以将它和ABManager​整合在一起

为了方便EditorResManager​的加载,我们规定所有会打包到AB包的文件都放置在:Assets/Editor/ArtRes/{AB包名}/​路径下
文件要打包到哪个AB包内就放到Assets/Editor/ArtRes/​的哪个文件夹下

image

在编辑器环境下,根据声明的变量isDebug​是否为true​,决定是使用AB包加载还是编辑器加载,非编辑器环境下,都使用AB包加载

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
using UnityEngine;
using UnityEngine.Events;

/// <summary>
/// 用于进行加载AB相关资源的整合,在开发中可以通过EditorResManager去加载对应资源去进行测试
/// </summary>
public class ABResManager : BaseManager<ABResManager>
{
private bool isDebug = true;

private ABResManager() { }

public void LoadResAsync<T>(string abName, string resName, UnityAction<T> callBack, bool isSync = false) where T : Object
{
#if UNITY_EDITOR
if (isDebug)
{
//我们自定义了一个AB包中资源的管理方式,对应文件夹名就是包名
T res = EditorResManager.Instance.LoadEditorRes<T>($"{abName}/{resName}");
callBack?.Invoke(res as T);
}
else
{
ABManager.Instance.LoadResAsync<T>(abName, resName, callBack, isSync);
}
#else
ABManager.Instance.LoadResAsync<T>(abName, resName, callBack, isSync);
#endif
}
}

使用示例:

1
2
3
4
5
6
7
8
9
10
11
public class Main : MonoBehaviour
{
void Start()
{
ABResManager.Instance.LoadResAsync<GameObject>("test", "Cube", (res) =>
{
GameObject obj = Instantiate(res);
obj.name = "ABResManager";
});
}
}

为什么不整合ResManager和UWQResManager

这两种资源加载管理器相对比较独立
一个专门用于加载Resources下的资源
一个专门用于加载指定位置的资源
当我们使用它们时那一定是确定了位置和加载方式后才会使用的,因此无需更多的整合处理