AssetBundle 热更新使用教程

AssetBundle原生API:

或者通过UnityEditor.AssetBundleBuild创建一个AB打包,
AssetBundleBuild解析:
assetBundleName:打包出来的名字
assetBundleVariant:用在不同版本资源的使用和动态替换AssetBundle
assetNames:这个AB包中有哪些资源,资源路径,注意:assetsNames 需要有 后缀名,且其路径从Asset开始,如:Assets/HotFix/xp.png,不然会抛异常导致打包失败

AssetDataBase.GetDependencies(文件路径):获取这个文件的所有依赖,返回的事依赖路径
开始打包
(1) BuildPipeline.BuildAssetBundles(string outputPath, AssetBundleBuild[] builds, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform)
解析:outputPath:输出目录
builds:所有需要构建的ab包
assetBundleOptions:ab包的选项,这个枚举是一个位枚举,可以多选(|)
targetPlatform:打包平台

(2) BuildAssetBundles(string outputPath, BuildAssetBundleOptions assetBundleOptions, BuildTarget targetPlatform)
解析:会遍历通过项目中的
在这里插入图片描述
进行打包

加密和解密

原则:加密可以慢一点,但是解密一定要快
利用对称加密,
可以通过System.Security.Cryptography.RijndaelManaged这个类进行加密和解密
也可以通过简单的有规律的异或操作进行编解码
读取的时候通过AssetBundle.LoadFromStream进行加载AB

AssetBundleBrowser

下载
github网址:https://github.com/Unity-Technologies/AssetBundles-Browser

使用
在需要打包的资源文件面板上选择需要打到那个AssetBundle中去
在这里插入图片描述

打开打包面板(通过Window/AssetBundleBrowser)
可以看到相关配置
在这里插入图片描述

Build
在这里插入图片描述
![在这里插入图片描述](https://img-blog.csdnimg.cn/196ebc3d07a04e138493b44f4fdc4fc5.png在这里插入图片描述
No Compression:不压缩,包很大,加载快
LZMA:包最小,但是加载慢,但是使用一个资源,这个包中所有的资源都会加载到内存中
LZ4:包相对LZMA大一点,加载相对LZMA快,但是使用一个资源,才会把这个资源加载到内存

打包后,会出现自己设置的ab包文件(资源文件)和manifest文件(提供资源信息,依赖关系,版本信息等等)以及关键AB包文件(跟目录名一样的包,主包,AB包依赖关键信息)

Inspect
在这里插入图片描述

可以添加ab包进来可视化这个ab包进行检查

加载

AB包加载
AssetBundle.LoadFromFile();通过路径同步加载ab包
AssetBundle.LoadFromAsync()异步加载

ab包中的资源加载
得到AssetBundle对象ab
ab.LoadAsset(“名字”);同步加载

ab包卸载
AssetBundle.UnloadAllAssetBundles(bool unloadAllObjects),卸载所有的ab包,unloadAllObject为是否需要连ab包中加载的资源也一起卸载

ab.Unload(bool unloadAllObjects);卸载单个ab包

注意:同一个ab包只允许加载一次,第二次就不了

如果一个资源A引用了别的AB包中的资源B,这个时候,如果只加载这个资源A所对应的AB包,会出现资源B丢失的现象,这个时候,需要把资源B所对应的AB包(依赖包)一起加载才能正常

这个时候通过加载主包,然后通过主包加载Manifest文件获取依赖

下载和更新

如何获取资源更新:加版本号判断,以及记录每个assetbundle文件的md5码,进行对比

断点续传:请求下载文件时,请求要下载的开始和结束位置,每次得到数据增量写进文件

每次请求的时候对比MD5值,如果MD5不同直接从0开始下载,如果相同,读取本地文件的长度,对比原本文件大小,如果小于它,代表需要增量下载,当本地文件的长度开始。
HTTP设置头: Request.SetRequset(“Range”,“bytes=”+fileLength+“-”);
文件增量写入1:FileStream fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write);
fileStream.Seek(fileLenght,SeekOrigin.Begin);
文件增量写入2 FileStream fileStream = new FileStream(filePath, FileMode.Append, FileAccess.Write);
开始下载;
int index = 0;
while(文件长度小于源文件长度){
fileStream.Write(dataBytes, index, dataBytes.Length-index);
index = dataBytes.Length;
}
fileStream.Close();
fileStream.Dispose();
//因为这个文件流是只写的,所以记住下载完成后,要关闭这个文件流,不然无法读取这个文件
//或者using(FileStream fs = new FileStream(filePath, FileMode.Append, FileAccess.Write){}
//自动释放

HTTP头

说明:此处假设Object资源大小为1000字节,Range有效区间为0~999。为避免指定的Range超出范围,可在Range读取前进行HeadObject请求,获取对象大小。
Range: byte=0-499:格式错误,byte应为bytes。
Range: bytes=0-1000:末字节1000超出有效区间。
Range: bytes=1000-2000:指定范围超出有效区间。
Range: bytes=1000-:首字节超出有效区间。
Range: bytes=-2000:指定范围超出有效区间。

HTTP头:https://help.aliyun.com/knowledge_detail/39571.html

流程:

1,先规划每个ab包的资源,控制ab包的大小在1-4M左右
2,然后打包放到服务器上
3,从服务器获取远程最新配置表
4,本地客户端的本地配置表和远程配置表对比。获得需要更新下载的资源包列表
5,从服务器下载资源包
6,创建一个缓存(比如字典),需要获取资源时,先找到这个资源所对应的AB包,在从主包中获取需要加载的依赖AB包
6-1:需要加载的AB包已加载,直接从AB中加载资源
6-2:未加载过,先加载AB包,在从AB中加载资源

AssetBundle注意事项:

1,AssetBundle打包出来的模型丢shader了
解决方法1:如果是自定义的shader,在项目中将shader加入Edit- >Project Settings->Graphics- >Always Included Shaders这个列表中
解决方法2:将shader放入Resource下,通过Resource加载这个shader给材质重新赋值

2,通过AssetBundle读取的资源,例如通过Load(),LoadAll()和mainAsset,是不能进行Destroy的。当AssetBundle被卸载时,默认会被一起析构。最好先Instantiate()出来一份再使用。Texture2D、Mesh这样的资源,需要在导入选项里勾选Read/Write Enabled。
3,当一个AssetBundle大小过大时,加载时间会很慢,做好规划每个ab包的资源,最好控制在3m 左右最好
4,,当请求范围超出范围,会请求下载所有的数据,范围是byte[]数组索引范围,
5,写入的过程中如果报了:IOException: Win32 IO returned 112这个错,基本上都是磁盘空间不足导致的
6,加载资源或则加载资源包失败,可能是因为高并发的原因,检查加载流程
7,打包的bundle名字不要重名,可能这重名的AB包不是同一个AB,但是同时加载会加载失败,即同一个项目中的如果需要同时加载的AB名字要唯一,比如目录(1/xp.bundle)和(2/xp.bundle)不是同一个AB,但是如果这两个AB都加载的话,后一个会报错,说已经加载过,不能重复加载,(加上前缀区别,比如1-xp,2-xp)
8,AssetBundle加载出来的材质调整自发光无反应,解决方法1:在打包前就先把自发光开启,并且发光颜色不能为黑色,但是如果你的AB包是Android平台的话,调整还是没有用,不知道是什么原因,Windows下就没问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值