资源加载系统AssetManager
资源加载系统AssetManager
背景
开发中,资源加载是至关重要的一部分,如何高效地加载、管理和释放资源变得尤为关键。资源加载系统旨在通过异步加载和同步加载来处理游戏中的资源管理。它能够加载、释放资源,并管理场景的加载与卸载。通过对资源的统一管理,提升资源的复用性,减少内存占用和加载时间。
与存储系统类似,资源加载的方式复杂多样,可以使用ab包方案,可以使用unity内置Resources方案。框架定位是轻量级项目框架,主要面向GameJam和中小体量独立游戏,所以框架采用unity提供的Addressables资源加载方案,本质还是ab包方案,但是比起传统ab包加载,Addressables完成了大部分构建岗的工作,使得 ab包 的导出和加载以及包内资源加载操作,变得方便且简洁。框架使用的是Addressables.cn插件,比起Addressables,中国版增加了ab包加密功能。直接防破解程度较强(暂时无解,抓帧另说),详见文章:il2cpp情况下破解Addressable.cn加密的ab包。
使用
资源文件管理规范
- 项目中的资源统一存放于:项目路径\Assets\AddressableAssets\
- 资源文件按用途进行分类:
- 仅勾选AddressableAssets文件夹即可,导出唯一一个ab包,尽管加载效率较低,但是方便管理,开发者可根据需求进行分包,或者自定义资源文件存放规范。
Addressables资源管理窗口
Addressables配置文件夹
勾选了AddressableAssets文件夹后,Addressables插件会自动生成配置文件夹,配置文件夹出错时,可以先取消勾选AddressableAssets,然后删除该配置文件夹,重新勾选AddressableAssets,自动重新生成配置文件夹。Addressables配置文件夹:项目路径\Assets\AddressableAssetsData
包体加密防破解
- 使用框架自定义加密脚本请自行修改密钥。
框架自定义加密脚本路径:项目路径\Assets\Scripts\Misc\Util\AddressableEncode.cs - 同时使用il2cpp打包方式,对秘钥进行加密,防止秘钥以明文被反编译。
- 可以不使用框架自定义加密脚本,但是使用插件内置加密方式的话,就能通过我的文章进行资源解密破解,即使你是通过il2cpp打包的方式,详见文章:il2cpp情况下破解Addressable.cn加密的ab包
读取资源
(通过协程方式完成异步加载,可自行封装task方式的异步加载)
1 | // 同步加载,AssetManager.Instance.LoadAsset<资源类型>(filePath) |
其中的 filePath 在Addressable资源管理窗口中进行复制:
配合数据配置系统使用
- 考虑到资源和路径经常更改,所以资源路径一般都配置在配置表中。所以几乎95%的资源加载通常都配合数据配置系统ConfigManager一起使用。
- 配置项声明资源路径,以配置bgm资源为例,BGM.xlsx:
- 获取AudioClip资源文件
1
2
3
4// 读取配置项的资源路径
var path = ConfigManager.Tables.CfgBGM["MainTitle"].AudioClipPath;
// 通过资源路径读取AudioClip资源文件
var audioClip = AssetManager.Instance.LoadAsset<AudioClip>(path);
注意事项
- 由于场景资源文件加载的特殊性,需要与常规资源文件的加载 区分开,详见场景管理模块SceneManager
- 中国版Addressables.cn有编辑器显示bug,无需关注。
- 有时更改资源文件的实际存放路径后,资源文件对应Addressable路径可能会更新不同步,可以进行 重新勾选AddressableAssets操作,强制更新资源文件的Addressable路径。
- 中国版Addressables.cn自2019年起停止维护,也无法下载,全网相关资料还少还全英,插件还有bug。(但它的加密功能真滴很实用啊!)
评论