Unity框架学习_ResManager,高效管理资源的加载和卸载
目录
1、博客介绍
本篇博客介绍了关于Unity3D资源动态的加载和卸载,并如何去高效的管理。本篇文章思路完全来自凉鞋大大的Unity3D框架QFramework中关于资源加载的方法,博主仅是套用思路补充了一些内容,其中包括了Resources方法加载资源,AssetBundle资源的加载。
2、内容
(1)引导
Resources:https://blog.csdn.net/Mr_Sun88/article/details/94147069
AssetBundle:https://blog.csdn.net/Mr_Sun88/article/details/86553465
对Resources方法和AssetBundle包的加载不熟悉的可以直接跳转博主的另外两篇文章
(2)主逻辑
资源类型标记:ResType
public enum ResType
{
ResSingle,//Res单个资源
ResGroup,//Res组资源
AssetBundle,//AB包资源
}
ResType枚举类型,标记了当前加载资源的类型
抽象资源脚本:Res.cs
/// <summary>
/// 资源容器成员属性和方法
/// </summary>
public interface IRes
{
ResType AssetType { get; set; }//资源类型标记
string AssetKey { get; set; }//资源标记
Object Asset { get; set; }//单体资源
Object[] Assets { get; set; }//资源组
int ReferenceCount { get; set; }//引用计数
void Reference();//引用执行
void Release();//释放执行
void Destroy();//摧毁执行
}
我们将每个需要加载的资源抽象为一个继承了IRes的Res,每个Res具备以上的属性和方法。
AssetType | 记录了当前资源的类型,是单个资源还是资源组或者是AB包 |
AssetKey | 将资源路径作为该资源加载时候的Key值 |
Asset | 如果是单个资源或者AB包,在构造Res时将资源赋值给Asset |
Assets | 如果是资源组,在构造Res时将资源组赋值给Assets |
ReferenceCount | 记录该资源被引用的次数 |
Reference() | 引用该资源的时候调用,ReferenceCount++ |
Release() | 释放该资源的时候调用,若还有该资源的引用则ReferenceCount--,若没有引用则释放资源 |
Destroy() | 不管该资源引用,直接释放 |
公共资源容器:PublicLoadingResList
/// <summary>
/// 公共容器 储存所有动态资源
/// </summary>
public static List<Res> PublicLoadingResList = new List<Res>();
所有加载器动态加载的资源均储存在公共容器PublicLoadingResList内
资源加载器:ResLoader.cs
/// <summary>
/// 资源的加载容器属性和方法
/// </summary>
public interface IResLoader
{
List<Res> SelfLoadingResList { get; set; } //储存当前容器加载的资源
T AssetLoad<T>(string assetPath) where T : Object; //Resources单个资源的同步加载
T[] AssetsLoad<T>(string folderPaht) where T : Object; //Resources目录下全部资源加载
IEnumerator AssetLoadAsync<T>(string assetPath, Action<T> callback) where T : Object; //异步加载Resources下的单个资源
AssetBundle ABLoadFromMemory(string assetPath); //直接加载AB包
IEnumerator ABLoadFromMemoryAsync(string assetPath, Action<AssetBundle> callback); //LoadFromMemoryAsync 异步加载AB包
AssetBundle ABLoadFromFile(string assetPath); //LoadFromFile直接加载本地AB包
IEnumerator ABLoadFromFileAsync(string assetPath, Action<AssetBundle> callback); //从本地异步加载AB资源
IEnumerator ABLoadWWW(string assetPath, Action<AssetBundle> callback); //WWW放置加载AB包
IEnumerator ABLoadWebRequest(string assetPath, Action<AssetBundle> callback); //WebRequest请求AB包
void UnloadAll();//卸载当前加载器资源
}
SelfLoadingResList | 储存当前加载器动态加载的资源 |
AssetLoad<T>(string assetPath) | 加载Resources目录下的路径资源 |
AssetsLoad<T>(string folderPaht) | 加载Resources目录下,某文件下所有资源 |
AssetLoadAsync<T>(string assetPath, Action<T>callback) | 异步加载Resources目录下的单个资源 |
ABLoadFromMemory(string assetPath) | LoadFromMemory方法加载AB包资源 |
ABLoadFromMemoryAsync(string assetPath, Action<AssetBundle> callback) | LoadFromMemoryAsync方法异步加载AB包资源 |
ABLoadFromFile(string assetPath) | LoadFromFile方法加载AB包资源 |
ABLoadFromFileAsync(string assetPath, Action<AssetBundle> callback) | LoadFromFileAsync方法异步记载AB包资源 |
ABLoadWWW(string assetPath, Action<AssetBundle> callback) | WWW方法异步加载AB包资源 |
ABLoadWebRequest(string assetPath, Action<AssetBundle> callback) | UnityWebRequestAssetBundle方法异步加载AB包资源 |
UnloadAll() | 卸载当前加载器资源 |
在需要动态加载资源的时候,我们实例一个ResLoader,用该加载器去加载当前页所有需要的资源,我们加载资源的时候会根据资源的AssetKey判断,该资源是否存在加载器容器内或者是否存在于公共容器内,若存在则直接返回不需要再加载,若不存在则加载资源并添加到容器内,如此可以避免重复加载资源,我们可以在当前页面销毁的时候直接调用当前页的加载器方法UnloadAll()来释放加载的资源,不同页面实例不同的加载器,方便资源管理。
资源加载器管理:
/// <summary>
/// 资源管理属性方法
/// </summary>
public interface IResManager
{
ResLoader GetResLoader();//获取资源加载器实例
}
GetResLoader() | 获取资源加载器ResLoader的实例 |
目前的管理器,只有一个方法来获取加载器的实例,后续还会继续补充
3、推送
工程演示Github: https://github.com/KingSun5/Study_ResManager
凉鞋Chat:https://gitbook.cn/books/5b36e7d3dc52aa6b10c03a29/index.html
QFramework: https://gitbook.cn/books/5b36e7d3dc52aa6b10c03a29/index.html
4、结语
因为内容繁多,所有主要的实现逻辑代码,博主都没有放出来,都在博主的Github的演示工程内,有需要的同学可以直接跳转到博主的Github,若是觉得博主的文章写的不错,不妨关注一下博主,点赞一下博文,另博主能力有限,若文中有出现什么错误的地方,欢迎各位评论指摘。
QQ交流群:806091680(Chinar)
该群为CSDN博主Chinar所创,推荐一下!我也在群里!
本文属于原创文章,转载请著名作者出处并置顶!!!!