制作一个承载想法的东西(六)——使用Addressables进行热更新(1.18.4)

  • A+
所属分类:Unity3d 原创文章

一、描述

游戏更新就是在游戏启动时或某一时机,触发程序去获取更新的列表类容,然后把新的东西全部下载到本地。而Addressable的机制似乎是为了当用到的时候才去下载对应的资源,这样好像不太友好,Bundle包大一点的就卡定在那里了。

我尝试过,把组设置成Local的形式,Bundle打进了包体里面,而对这些Local组的Bundle做更新的话据需要做增量包,Addressable可以识别而动态生成Remote的远程组生成远程Bundle,但是每次都要做这样的增量包,组会越来越多,且不容易管理。

后来我再尝试把组都设置成Remote,结果Bundle不打进包体里面,再程序运行的时候需要用时才去下载,就算你用特殊手段把Bundle干进包体里,Load Path记录的也是远程的地址,当你使用到某个资源时还是会走远程下载。

所以为了实现,不做增量包(方便管理),使用整Bundle的形式更新,设置成Remote形式也能打进包里,并能正确的加载内置的Bundle,需要自定义Addressable的打包和加载Bundle。

 

二、一键动态标志资源地址

工具类,这是网上找的,可以动态的创建或删除组,为资源添加label 加入到组。

 

静态方法,提供给编辑器扩展菜单使用

制作一个承载想法的东西(六)——使用Addressables进行热更新(1.18.4) 制作一个承载想法的东西(六)——使用Addressables进行热更新(1.18.4)

 

三、自定义Bundle打包方式

新建脚本,继承自BuildScriptPackedMode,添加特性菜单,生成资源,重写3个方法,把这3个方法复制过来,并修改源码方法为virtual。

Name方法,修改返回的名字,就是你Build看见的名字。

BuildDataImplementation 这里修改的主要是初始化BuildInData,创建Resources/Version目录,存放BuildInData序列化后内容,然后打进包里。

PostProcessBundles 这里修改的主要是,把Bundle生成的名字记录到BuildInData(为准确加载准备,Bundle名字为组名+hash,所以可以直接判断名字),把打出来的Bundle复制到Library(因为都设置为远程加载了),使其可以复制到StreamAssets目录打进包里。

 

设置应用为自定义打包

制作一个承载想法的东西(六)——使用Addressables进行热更新(1.18.4) 制作一个承载想法的东西(六)——使用Addressables进行热更新(1.18.4) 制作一个承载想法的东西(六)——使用Addressables进行热更新(1.18.4)

 

对了,设置AddressableAssetSettings的PlayerVersionOverried为固定版本,打包出来的catalog就都为同一个,更新这个用来检测更新。

 

四、自定义Bundle加载方式

前面自定义了Bundle的打包方式,现在就要自定义加载方式了,不然就会走原来设置的远程加载的原本逻辑,我们多做了一个内置包列表和复制移动Bundle到Library中的准备工作就没有用了。

注意如果是UnityWebRequestAssetBundle,则不会支持访问data去保存,不过自行缓存,此时只需要判断是不是内置Bundle就行,其他走web。需要自己缓存Bundle的,需要修改UnityWebRequestAssetBundle为UnityWebRequest

新建一个cs文件MyAssetBundleProvider,复制原内容的AssetBundlePrivider到新建cs脚本中,修改相关类名为自己自定义类名。主要修改IAssetBundleResource的BeginOperation方法和WebRequestOperationCompleted方法

 

读取内置包列表,缓存Bundle到本地,检查是否有缓存,都是使用 AssetBundleManager.cs

 

自定义写完后,需要应用使用上这个自定义加载Provider

 

五、检测更新并下载更新

需要扩展两个方法出来,一个是修改请求catalog的地址,一个是获取Bundle的大小接口

 

更新流程:

  1. 设置加载资源的远程路径,catalog和Bundle
  2. 检查网络资源表catalog
  3. 下载网络资源表catalog
  4. 通过全局资源lable后去所有的ResourceLocation
  5. 自定义辨别筛选出需要更新Bundle资源的ResourceLocation
  6. 获取下载的大小
  7. 更新下载

 

其中OperationData为继承IEnumerator,提供异步等待,导出到lua层,lua层可以根据判断这个步骤是否完成,从而进入到下一步骤。

 

 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:1   其中:访客  1   博主  0

    • dd dd 1

      有没有工程提供学习一下