28.资源加载模块整合

一、小框架代码整合

资源加载模块中,会把之前已经完成的小框架代码按照功能进行分类整理,放到对应的框架文件夹中。目的主要是:

统一管理代码
明确不同管理器的职责
方便后续项目直接复用

二、资源加载模块中的几个管理器

当前资源加载相关管理器主要包括:

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()
    {

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值