![8d8fdaa8a3466cbab7fae48fe5d64a64.png](https://img-blog.csdnimg.cn/img_convert/8d8fdaa8a3466cbab7fae48fe5d64a64.png)
资源管理作为游戏开发中非常重要的一个模块,真的有很多很多需要去了解的东西。最基本的资源读取到资源打包,资源打包策略,资源下载读取等每一个点都有很多值得去仔细推敲的点。
资源读取
Unity的资源读取方式比较简单,大体上可以分为以下四种方式:
1 直接声明Public变量
- Public声明一个变量,直接把Assets下的资源拖动赋值,然后直接代码实例化。商业项目中不会使用这种方式,初学者做Demo测试的时候可以使用。
2 Resource.Load
- Resource.load<>()读取,文件存储位置在Assets下面的Resource目录下,可以直接读取实例化。该目录下面的所有文件在打包的时候都会在出包的时候进包。Unity是不推荐我们使用Resource.load方式读取资源的,原因如下:
![5da6bd7e6327021a44b9a991a59ba1a2.png](https://img-blog.csdnimg.cn/img_convert/5da6bd7e6327021a44b9a991a59ba1a2.png)
简单的总结下缺点:
- 增大了游戏内容管理的负担
- 随着资源文件夹的增加,应用程序在启动的时候时间会增加。二千会(个人猜测:在游戏初始化的时候,会对该文件夹下的所有文件文件信息进行统一处理,方便在运行时加载)
- 资源优化不方便
- 没法儿资源热更
关于Resource文件的序列化
在Unity打包的时候,Resource文件夹下的文件会生成一个依赖文件,存储文件的一些信息。FileGUID和LocalID来代表文件以及文件位置,然后运行的时候会根据以上两个Id生成唯一的InstanceId。
3 AssetBundle读取
- AssetBundle这是最常用的一种方式,目前商业化开发中基本都会使用这种方式来进行资源管理。
AssetBundle的作用
- AssetBundle(简称AB包)是一个资源压缩包,包含模型、贴图、预制体、声音、甚至整个场景,可以在游戏运行的时候被加载
- AssetBundle自身保存着互相的依赖关系
- 压缩包可以使用LZMA和LZ4压缩算法,减少包大小,更快的进行网络传输
- 把一些可以下载内容放在AssetBundle里面,可以减少安装包的大小
什么是AssetBundle
- 它是一个存在于硬盘上的文件。可以称之为压缩包。这个压缩包可以认为是一个文件夹,里面包含了多个文件。这些文件可以分为两类:serialized file 和 resource files。(序列化文件和源文件)。 serialized file:资源被打碎放在一个对象中,最后统一被写进一个单独的文件(只有一个)。 resource files:某些二进制资源(图片、声音)被单独保存,方便快速加载,可以Editor上读取,方便查看。
- 它是一个AssetBundle对象,我们可以通过代码从一个特定的压缩包加载出来的对象。这个对象包含了所有我们当初添加到这个压缩包里面的内容,我们可以通过这个对象加载出来使用。
AssetBundle的使用步骤
- 给制定资源添加AssetBundle名字
- 打包Ab
- 上传Ab到服务器
- 加载Ab包和相关资源使用
简单介绍下AssetBundle的打包,给读取做个铺垫
打包路径
一般以Appcation.Datapath(Assets目录)下的StreamingAssets为输出路径。
压缩方式
- BuildAssetBundleOptions.None:使用LZMA算法压缩,压缩的包更小,但是加载时间更长,需要解压全部。
- BuildAssetBundleOptions.UncompressedAssetBundle:不压缩,包大,加载快
- BuildAssetBundleOptions.ChunkBasedCompression:使用LZ4压缩,压缩率没有LZMA高,但是我们可以加载指定资源而不用解压全部。
注意:使用LZ4压缩,可以获得可以跟不压缩相媲美的加载速度,而且比不压缩文件要小。
![f688e588a93324f3d76f6cca1bf85b02.png](https://img-blog.csdnimg.cn/img_convert/f688e588a93324f3d76f6cca1bf85b02.png)
基础接口:
![785488bc68fda3e7462290272de623a9.png](https://img-blog.csdnimg.cn/img_convert/785488bc68fda3e7462290272de623a9.png)
打包完成之后会在对应的文件夹下面生成相应的Ab文件,这种方法是不推荐使用的,因为这样打包方法会有资源的冗余。我们来做一个很简单的假设:
![b945221f33235983cfeacf28bcf53b16.png](https://img-blog.csdnimg.cn/img_convert/b945221f33235983cfeacf28bcf53b16.png)
我们这里有两个Prefab,分别为Cube和Sphere,给他们分别设置了Ab名分别为cube和sp。
![051f9b16e79835016f6367e30d6b7f1e.png](https://img-blog.csdnimg.cn/img_convert/051f9b16e79835016f6367e30d6b7f1e.png)
![3db4cf38951fb6658b9d4e0d39d4b95f.png](https://img-blog.csdnimg.cn/img_convert/3db4cf38951fb6658b9d4e0d39d4b95f.png)
这两个Prefab都引用了同一份材质和贴图。
![a2f3d834ebc3fd191c848472b73fa76e.png](https://img-blog.csdnimg.cn/img_convert/a2f3d834ebc3fd191c848472b73fa76e.png)
打包结果可想而知,两个ab文件大小相同,并且每个包中都有重复的资源。
![56ee502f37ce84ff64806c996afe78af.png](https://img-blog.csdnimg.cn/img_convert/56ee502f37ce84ff64806c996afe78af.png)
商业项目中,资源的重复无疑会给内存和包体还有加载时间带来巨大的问题。这中粗鲁的打包方案明显是不靠谱的。
商业化打包方案:
真正商业化的打包,核心并不是在打包,而是在资源的依赖管理策略。关于打包的策略准备单独开一篇文章。日后附上链接。
ToDo......
重点来了,分析下几种Ab的读取方式
4 AssetDataBase直接读取本地文件
这种方式一般用于编辑器下的本地资源的读取。
持续更新中....