简介
本篇文章,已经涉及到可以直接使用AssetsBundle的情况,并且是专门为学习AssetsBundle而写,如果觉得看一遍记不住的话,建议自己练习尝试,加深理解,学习无价,如果错过,你将错过“一个亿”
1. 定义、用途以及打包种类
1.1 定义
什么是AssetBundle?用我自己的话来讲,AssetBundle是Unity中常用于对游戏资源打包的一种方法。
1.2 用途
为什么要用AssetBundle?很多时候,自己用Unity写出来的游戏,一般情况下Resource文件夹下都有这个游戏的游戏资源,这些游戏资源有时候数量过于庞大,需要用到些许时间才能下载完毕。而在玩家把游戏的所有资源都下载完毕之后,如果某一天不小心动了里面的某个资源,不知道怎么改回来了,是不是又要重新下载呢?玩家不可能又要花一些时间去重新下载这些资源。毕竟,丢失的资源只有那么一丢丢,而因为这一丢丢的资源又要花时间去下载,不值得。这时候,遇到这种问题,就需要用到AssetBundle了。它能够帮玩家检查游戏究竟是哪里丢失了什么文件,根据指定丢失的文件,进行对应资源的下载,既不需要重新下载资源,浪费时间,浪费精力,又能够快速便捷的就能玩上游戏,何乐而不为?
有的人会问,我即使不把资源放到远程服务器上,我直接就是全部下载,不行吗?行,怎么不行,但是如果你下载完完整资源之后游戏中的某个环节资源丢失了怎么办?
1.3 打包种类
使用AssetBundle打包,能够打包的游戏资源中包括音频资源,模型资源,纹理材质资源,UI贴图资源等等,这些资源之间如果有相互依赖关系的话,那么,在使用AssetBundle打包时,也会把他们之间的依赖关系一起跟着打包,这样的话,在解包的时候,他们身上的依赖关系就不会解除。
注意:AssetBundle不能打包脚本文件,但是有一个解决方法,那就是把他们弄成dll文件,dll文件可以打包,具体怎么弄,这里暂不说明。
好比一个有着贴图的3D模型,如果他们之间的依赖关系在打包的时候没有跟着一起打包的话,那么他们在解包拿出来之后,即使把模型拖到游戏物体上,也只会看到因贴图丢失而出现粉红色的模型
其实,对游戏资源的打包,不止AssetBundle一个打包方式,但是我在这里就着重讲关于AssetBundle的知识。
2. 准备条件
想要使用AssetBundle方法进行导包,首先需要两个前提和三个准备条件
- 前提一:懂得使用MenuItem方法在unity界面的菜单栏上建目录
- 前提二:懂得普通脚本和Editor脚本的区别,懂得使用文件IO流
- 条件一:在unity的项目栏建一个Editor文件夹,并创建脚本,建议脚本名字为Editor
- 条件二:为新建的Editor脚本Using UnityEditor 命名空间,Using System.IO命名空间
- 条件三:准备好AssetsBundle导出路径
有了这些前提和准备,就可以为之后的方法做准备
3. 导出方式
导出方式多种多样,很多时候,只要摸透了导出数据包的方法,一般都能够进行举一反三,自己写出符合自己的方法。
这里用到的方法一般公司上都会用到,在这里只提到两种,剩下的,靠小伙伴们自己举一反三
- 手动导出AssetsBundle包
- 自动根据代码按不同类型资源导出到对应类型包
- 自动根据代码不按对应类型,全部资源都导出到同一个包里面
4.导出包准备方法
不管是手动导出AssetsBundle包还是自动导出AssetsBundle包,都需要准备好 导出包的文件路径
4.1 手动导出AssetsBundle包
4.1.1逻辑
-
在Unity界面,手动进行AssetsBundle的设置,名字可以是自己想要的名字,后缀名也可以是其他,只要不是none就都可以 图片展示: -
写代码方法时,为了以防万一,可以对导出的文件路径进行判断操作,判断是否有该路径,有,不做处理;没有,就新建该路径 -
使用建立管线中的建立AssetsBundle方法,该方法中有三个传参,分别是:
参数一:输出方式 参数二:压缩方式 参数三:打包对应平台
- 刷新,防止卡住,文件打包失败
4.1.2 代码展示
4.2 自动导出AssetsBundle包
5.检查导出包完整性
那导出Assets包之后如何进行使用,又是如何判断导出包文件的数据完整性呢?可能有的小伙伴就想到,把他们打包出来的数据包名称都存到一个文件夹里面,这样子在使用的时候就可以通过数据包的名称进行查找,如果查找到的包含相同名字的数据包,是可以确定数据的完整性的 。
上述例子,如果有想过的小伙伴们,我会说你们大错特错了,假如我偷偷的把文件删掉,添加一个相同数据包名字的文件进去呢?假如我偷偷把文件数据包里面修改点数据进去呢?那这种方法就性不同了,所以我这里,我就采用了另一个方式对如何检查包完整性做了一些方法
5.1 MD5格式打包方法
5.1.1 为什么要使用MD5
为什么要使用该方法?这是因为只要使用了该方法,那么转出来的格式密码就是唯一的,不管是对导出包数据,还是对导出包名字,都是唯一的。如果其他人想要通过更改数据包文件数据,或者是更改数据包文件名称,那么这个数据转成MD5格式数据之后,就会和原来的MD5格式数据不一样,这样子就能起到判断导出包数据是否完整的作用。
而在Unity中,有一个自己内置的MD5格式转换的方法,只需要把导出包的所有数据单独都转成MD5格式数据,并加上该MD5格式的导出包名称,就可以起到一个判断导出包数据完整性的作用。
如果在一个Txt文件上存放所有导出包的名称和MD5格式数据,在想要使用该包的时候,检查一下这个Txt文件所附的目录下数据包是否一一对应,我们就能够实现使用包或者是更新资源的一种判断。
一般我们称存放所有数据包名称和MD5数据的文件为Config文件!
上面提到导出包的使用方式,所以这里就讲关于检查导出包资源完整性的方法和导入包的方法
5.1.2 MD5准备工作
- 引用命名空间System.Security.Cryptography
- 引用命名空间System.IO
- 引用命名空间System.Text
5.1.3 MD5转换逻辑
我们要知道,我们要转换成MD5格式的东西是什么,那就是导出AssetsBundle包的包路径。我们把该路径转为MD5格式,这样再返回出去,这就是MD5在这里的用途,其他用途也会用到,但这里只展示这些。
- 首先定义一个方法,用来传路径名
- 再使用文件IO流打开该路径下的文件流
- 实例化对象MD5
- 使用MD5格式转换文件流为二进制数据,并用一个二进制数组进行存放
- 实例化字符串拼接的对象StringBuilder
- 通过遍历二进制数组,用字符串拼接的方式把二进制拼接起来,并转换为二位十六进制的数据
- 把该二位十六进制的数据返回出去
相关MD5的代码,我放到另外一边了 https://blog.csdn.net/qq_46005796/article/details/118417071
5.2 MD5代码展示
6.检查文件完整性
把导出来的AssetsBundle包的包名和包路径位置都存储到一个config文件内,并把该config文件存放到AssetsBundle的父级目录下,与该父级目录同级,这样,在检查整个assetsbundle文件完整性时,只需要检查config文件内数据是否和父级目录内的assetsbundle文件一一对应,就能够知道资源是否完整
6.1 Config文件
该文件存储有两种数据:
- AssetsBundle数据包名
- AssetsBundle数据包路径
图片展示:
6.2 实现逻辑
想要实现Config文件的创建,我们首先就要联想到文件IO流,既然涉及到创建,那必然离不开文件相关操作。所以,我们就要先得到要创建Config文件的路径。既然得到了文件路径,那么就要生成Config文件,那生成Config文件之后呢?总不会里面一片空白吧?
上面刚才也提到,Config文件存储有两种不同类型的数据,那么,Config文件里面存放什么?想必都知道了吧。那怎么得到呢?那就判断该打包资源路径下有没有文件,有,就得到所有的文件名以及所有的文件路径。而这些方法,就要用到IO文件流。得到完这些数据之后,文件名可以不作出任何操作,但是文件路径,就必须要进行操作之后才能进行存储。
上面说过的MD5格式,这时候就要用到了,得到文件路径,并用MD5把文件路径转格式之后,再存进Config文件数据之中,对应文件之后。一个文件一个文件的放,最终所有的导出包文件文件名和MD5格式加密字符都有了,这个Config文件就算成功
6.3 Config代码实现
之后还有导入包的方法,留到后面去书写
7.1 导入包
把需要导出的AssetBundle资源全部导出去之后
8.1 使用导入包
转载请声明作者,谢谢
|