Unity框架学习_ResManager,高效管理资源的加载和卸载

         Unity框架学习_ResManager,高效管理资源的加载和卸载


目录

1、博客介绍

2、内容

(1)引导

(2)主逻辑

3、推送

4、结语


1、博客介绍

       本篇博客介绍了关于Unity3D资源动态的加载和卸载,并如何去高效的管理。本篇文章思路完全来自凉鞋大大的Unity3D框架QFramework中关于资源加载的方法,博主仅是套用思路补充了一些内容,其中包括了Resources方法加载资源,AssetBundle资源的加载。


2、内容

(1)引导

Resourceshttps://blog.csdn.net/Mr_Sun88/article/details/94147069

AssetBundlehttps://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所创,推荐一下!我也在群里!

       本文属于原创文章,转载请著名作者出处并置顶!!!!

猜你喜欢

转载自blog.csdn.net/Mr_Sun88/article/details/94357068