【Unity3D_常用模块】资源管理器(AssetManager.cs)

【Unity3D_常用模块】资源管理器(AssetManager.cs)

友情提示:
1.上面的介绍非常详细,基本是每个函数,常量的注释都在上面,所以,看上去,好像里面内容很多,其实不然。真正的最核心的调用函数紧紧只有2个。
第一个:异步预加载单个资源:PreLoadAssetAsync(...)
第二个:同步预加载单个资源:PreLoadAsset(...)
其他的几个调用相关的函数,基本为了提高使用方便,进行一些简单的封装。
2.该博客尚未完结,接下去的时间,一只会进行维护。
3.目前项目工程已传至CSDN,末尾有下载地址。 但是需要5个点的积分,积分不够,请联系QQ:8321884索取,只要留言,都会回复。
4.特此感谢同仁@冯**(联系QQ:583280516),在其帮助下,该工具得以更顺利的完成,在编写过程中,也提供了不少思路,感谢!!!!

只要有耐心的慢慢看,一定能够看懂。注释也写的非常的详细。

只要有耐心的慢慢看,一定能够看懂。注释也写的非常的详细。

只要有耐心的慢慢看,一定能够看懂。注释也写的非常的详细。

--------------------------------------------------------------------------------华丽的分割线--------------------------------------------------------------------------------

简单说明:

1.主要目的是让逻辑开发过程中摒弃AssetBundle的概念。在逻辑开发过程中,只需要对资源路径进行管理即可。
2.基本逻辑是参考Unity3D原生插件(AssetBundleManager.unitypackage)进行修改,封装。
3.具体使用方法,还需根据具体项目,开发环境以及策划需求,进行调整。


脚本说明:
1.资源包加载运算数据结构相关定义:(AssetBundleLoadDefine.cs)
1) 接口基类:LoadOperation_Base
2) 异步AssetBundle加载基础运算结构:LoadAssetBundle_Operation_Base
3) 异步Asset加载基础运算结构:LoadAsset_Operation_Base
4) 异步AssetBundle加载运算:Load_AssetBundle_OperationAsync
5) 同步AssetBundle加载运算:Load_AssetBundle_Operation
6) 同步Scene加载运算,编辑器环境:LoadLevel_Operation_InEditor
7) 异步Scene 加载运算,编辑器环境:LoadLevel_Operation_InEditorAsync
8) 同步LevelScene加载数据结构:LoadLevel_Operation
9) 异步LevelScene加载数据结构:LoadLevel_OperationAsync
10) 异步Asset加载数据结构,编辑器环境:LoadAsset_Operation_InEditor
11) 异步Asset加载数据结构:LoadAsset_OperationAsync
12) 同步Asset加载数据结构:LoadAsset_Operation
13) 已加载完成的AssetBundle,引用基数等基本包装:LoadedAssetBundle
14) 已加载完成的Asset,引用基数等基本包装:LoadedAsset
15) 委托,根据AssetBundleName获取已加载完成的AssetBundle:Delegate_GetLoadedAssetBundle


2.资源管理器逻辑:(AssetManager.cs)
1) 私有变量:
1.1) 资源路径重写(特殊资源路径的筛选,替换):overrideAssetBundlePathHandle
1.2) 已经加载完成的AssetBundle对象缓存:m_LoadedAssetBundles
1.3) 已经加载完成的Asset对象缓存:m_LoadedAssets
1.4) 资源加载错误信息缓存(Key:AssetBundleName, Value:ErrorContent):m_LoadingErrors
1.5) 记录当前正在加载的AssetBundleName缓存:m_LoadingBundles
1.6) 正在加载中的AssetBundle结构对象缓存:m_LoadingOperations
1.7) 资源引用缓存(Key:AssetBundleName, Value:Dependencies):m_Dependencies
2) 私有方法:
2.1) 根据AssetBundleName,配合第三方委托函数,确定,加载目录,路径:GetAssetBundlePath(...)
2.2) AssetBundle 加载完成逻辑:ProcessFinishedOperation(...)
2.3) 资源包加载基础接口:LoadAssetBundle(...)
2.4) 通过AssetBundleName,构建资源加载数据结构,并添加至缓存中,遍历扫描,进行加载:LoadAssetBundleInternal(...)
2.5) 搜集AssetBundle的相关引用,并进行加载:LoadDependencies(...)
2.6) 卸载该AssetBundle的相关引用资源:UnloadDependencies(...)
2.7) 卸载主资源:UnloadAssetBundleInternal(...)
2.8) 完整卸载AssetBundle(主资源,依赖资源):UnloadAssetBundle(...)
2.9) 同步加载资源对象基础方法:LoadAssetBase(...)
2.10) 异步加载资源对象基础方法:LoadAssetBaseAsync(...)
2.11) 同步加载场景对象基础方法:LoadLevelBase(...)
2.12) 异步加载场景对象基础方法:LoadLevelBaseAsync(...)
2.13) 根据AssetBundleName,获取已经加载完成的AssetBundle:GetLoadedAssetBundle(...)
2.14) 添加对象至资源缓存目录,路径:AddAssetObjectToCache(...)
2.15) 获取资源对象名字,根据资源路径:GetAssetNameByAssetPath(...)
2.16) 获取资源对象在缓存中对应的Key值,根据资源路径:GetAssetKeyByAssetPath(...)
2.17) 获取AssetBundleName,根据资源路径:GetAssetBundleNameByAssetPath(...)
3) 公开方法:
3.1) 初始化:InitManager(...)
3.2) 资源每帧检测资源加载状态:Update(...)
3.3) 获取资源相关方法:
3.3.1) 从缓存中获取单个资源对象,如果不存在返回Null值:GetAssetObjectFromCache(...)
3.3.2) 从缓存中获取多个资源对象,如果不存在返回Null值:GetAssetObjectFromCache(...)
3.3.3) 同步安全获取单个缓存资源(不存在,则加载):SafeGetAssetObjectFromCache(...)
3.3.4) 同步安全获取多个缓存资源(不存在,则加载):SafeGetAssetObjectsFromCache(...)
3.3.5) 异步安全获取单个缓存资源(不存在,则加载):SafeGetAssetObjectFromCacheAsync(...)
3.3.6) 异步安全获取多个缓存资源(不存在,则加载):SafeGetAssetObjectsFromCacheAsync(...)
3.4) 预加载资源相关方法
3.4.1) 异步预加载单个资源:PreLoadAssetAsync(...)
3.4.2) 异步预加载多个资源:PreLoadAssetsAsync(...)
3.4.3) 同步预加载单个资源:PreLoadAsset(...)
3.4.4) 同步预加载多个资源:PreLoadAssets(...)
3.5) 场景加载相关方法
3.5.1) 同步加载场景:LoadScene(...)
3.5.2) 异步加载场景:LoadSceneAsync(...)
3.6) 卸载相关方法
3.6.1) 卸载单个资源:UnLoadAsset(...)
3.6.2) 卸载多个资源:UnLoadAssets(...)
3.6.3) 卸载单个场景:UnLoadScene(...)
3.6.4) 卸载多个场景:UnLoadScenes(...)
3.7) 调试
3.7.1) 打印AssetBundle缓存列表:ShowAssetBundleCache()
3.7.2) 打印资源缓存列表:ShowAssetCache()


3.游戏控制中心:(GameCenter.cs)
1) 路径重写委托:OverrideAssetBundlePathHandle(...)
2) 游戏启动:StartUp(...)
3) 测试加载:Test_Load(...)


4.游戏启动:(GameInit.cs)
1) 游戏启动:Start(...)

-------------------------------------------------------------------------------- 华丽的分割线 --------------------------------------------------------------------------------
备注:
1.工程项目中,有两个文件,分别为Unity3D官方插件(AssetBundleManager.unitypackage未修改) 与 该文章的介绍的AssetManager.unitypackage。
2.AssetManager工程中,只做了一个测试(既:异步安全获取单个缓存资源(不存在,则加载):SafeGetAssetObjectFromCacheAsync(...))。
3.在AssetManager会对资源对象,会做缓存,故,在加载之后,需要调用相关UnLoad进行释放,这里,还在斟酌是在AssetManager中处理,还是调用者处理。
4.因为时间问题,所以,就先把项目工程传上来,所以,暂未做严格的深入的测试。如果需要使用,建议做一次完成的测试。
5.之后笔者会抽时间做一次完整的严格的真机测试,包括每个函数的调用,缓存情况,等。
6.在加载相关的数据结构中,已经有加载进度的数值存储,当然,改功能暂未完善,还在思考,如果更好的实现,之后会补充。
7.AssetManager的项目中,却少对资源Mark的编辑器脚本(即,对资源进行批量的AssetBundleName批量设置的操作),该功能其实已经,完成,当时还须时日进行优化调整,故,在项目中如果需要设置,需要手动设置一下资源的AssetBundleName。



工程项目(点击下载)


你可能感兴趣的:(Unity3D)