Unity资源热更新--资源管理Addressable

Posted hippodu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Unity资源热更新--资源管理Addressable相关的知识,希望对你有一定的参考价值。

实习前理解错了mentor的意思,任务没完成TAT,火速学习一下addressable,另外狠狠吐槽北京健康宝弹窗。

资源打包方式

可热更资源类型:预制件、材质、贴图、模型、场景、shader、动画与控制器(除代码外所有资源)

打包方式:按照标签、按照资源路径、打包插件(压缩选项与文版文件)

Addressable 

作用:①对assetbundle的包装②内存管理

支持资源引用计数

自动资源寻址:指定资源名称不用关心放在哪里,一个可寻址的引用,无论资源在云端还是本地。

远程/本地热更新对开发者透明,

菜单栏 window assets management --addressable- group 打开,添加拖拽即可,可以在其中重命名,默认的组为本地,远端则需要修改组设置: remoteloadpath为上传网址

制作AssetBundle

 三种测试模式:不打包 模拟打包 真正打包

第三种 每次修改都需要重新打包才能生效

第一种和在本地类似

第二种模拟打包便于测试

加载资源时如场景,不能用LoadScene,要使用异步的API:
 

Addressables.LoadSceneAsync(。。。);//加载
Addressables.UnLoadSceneAsync(。。。);//返回

获取要下载资源的大小:

Addressables.GetDownloadSizeAsync(levelReferences[index].RuntimeKey)

下载资源: 

Addressables.DownloadDependenciesAsync();

显示下载的百分比,因为每一帧都要显示 百分比故使用携程,下载资源的api上面提到的,返回的时AsyncOperationHandle,包括资源以及相关的状态信息途径信息过程信息,有关Async的方法都返回 AsyncOperationHandle。

在下面BundleMode中可以选择打包到一起还是分开打包(示例中的Remote group中的资源) 

 

 打包资源:在测试模式选择旁边的build,即可完成打包,打包后将资源上云等方式存储,将URL保存,打开addressable groups在测试模式旁边的tools-window-profiles 更改remoteloadpath路径为保存资源的网址。

后面遇到了许多问题,比如服务器跨域,参考了下面的解决:

Unity Webgl版本客户端处理跨域不能访问的问题_yiqiweichi的博客-CSDN博客_unity webgl 跨域

另外,发现资源云分发,使用unity CCD+adressableasset 非常方便,由unity帮你解决这些麻烦,教程b站上有官方的, 后续可以写个教程,并且汇总一些这段时间打包webgl出现的问题。

Unity 之 Addressable可寻址系统 -- 资源热更新

可寻址系统远程加载 -- 资源热更新 -- 进阶(四)

概述:Unity可寻址系统的资源热更是我遇到过最简单的热更方式了。只需修改资源组然后发布资源热更即可。本篇文章就来为讲解AA的资源热更,并通过CCD实现资源热更完整流程。


一,本地实现资源热更

1.1 资源热更概念

Addressables 将资源的引用和打包分开处理,可加快运行模式下和运行版本的项目迭代。系统将资源合并为一个个的 Asset Bundles(资源包),一种可在运行时分发、加载资源的 Unity 专有文件结构,然后生成一个内容目录来辅助运行时的内容加载与资源跟踪。

打包出来的资源目录:

Addressable的资源热更,特别适合那种边下边玩的游戏,因为它不是在游戏刚进去时更新完所有资源。

我们把下载AB的实现交给了Addressable,它的实现是当你在加载资源时找到这个资源的ab包,然后通过UnityWebRequestAssetBundle判断该AB包是不是已经下载如果下载那么直接从缓存目录加载,不然就下载到缓存目录再加载。所以我们要先加载资源才会去下载ab包。

若需要进入游戏就下载所有资源可以参考我上一篇文章写的与下载工具类:
Unity 之 可寻址系统 - 资源远程加载 - 资源预下载 - 进阶(三)


1.2 具体实现步骤

先在本地模拟一下资源热更的流程吧。

步骤如下:

  1. 准备两个预制体
  2. 创建一个资源组,将一个预制放到组中
  3. 编写代码加载资源组中,将其生成到场景中
  4. 资源地址设置,打资源包
  5. 发布查看是否正常加载运行
  6. 将资源组中的预制替换,发布本地资源热更
  7. 再次运行查看是否更换

1.3 本地资源热更

按照上面的步骤操作一下:

  1. 准备两个预制体,我这里准备了两个不同材质的Cube

  2. 创建一个资源组,资源组命名为:HotUpdate Group。将一个预制放到组中,资源Key命名为:UpdateCube

  3. 编写代码加载资源组中,将其生成到场景中。创建一个空物体将代码挂载,运行查看效果:
    示例代码如下:

  4. 资源地址设置,打资源包
    设置资源地址:将本地地址都修改为自定义。注意地址要在根目录下开始写(Windows就在盘符开始)。

    选中2步骤创建的HotUpdate Group资源组,在Inspector面板上设置为Local,此时下面的路径就变成上面设置的了:

    打资源包在Groups面板,Build -> New Build -> Default Build Script

    打包出来的:

  5. 发布查看效果,可以成功加载设置的预制:

  6. 将资源组中的预制替换,发布本地资源热更:
    将需要替换的预制也放到刚刚的资源组中,然后将Key修改到和被替换的一样

    移除被替换的资源:(注意:这里的资源和2步骤中的Key保持一直,因为代码是根据这个Key来加载的)

    发布资源热更:Groups面板 Build ->Update a Previous Build

    点击后弹窗选择一个.bin文件(找到你的要发布的平台文件夹)

    发布完成后,可以在刚刚的文件夹下看到两个前缀为hotupdategroup的资源组了

  7. 再次运行,可以看到白色Cube变为了黑色的:

这就通过可寻址资源管理系统,实现本地资源热更了。其实联网热更也是一样的道理,只需要将上面配置加载资源地址修改为在网络加载,再将打包出来的资源上传到CDN上即可,下面通过Unity推荐的CCD实现一下联网热更。

若你看了上一篇文章CCD的使用,可以结合上面这个本地资源热更流程自己尝试一下联网热更。


二,AA + CCD实现资源热更

2.1 工程设置

使用CCD的准备工作,详情查看上一篇CCD的使用

  1. 创建桶
    在后台创建一个新的桶来实现资源热更:我这里命名为:AA+CCD-ReGeng:

  2. 打包设置:
    设置远程加载路径:

  3. 打包资源:
    设置完成后,进行资源打包。

    注意此时的资源组是远程加载的

  4. 上传资源
    选择刚刚创建的AA+CCD-ReGeng桶,然后选择3步骤中打包的资源,点击Sync上传:

  5. 上传版本
    点击New新建一个版本,然后Load同步到后台

  6. 上传完成后,可以在后台看到刚刚上传的版本

  7. 此时打包Apk安装到手机上,可成功加载远程的黑色Cube就可以了


2.2 实现热更

  1. 修改资源包内容
    这里是将黑色的“HotUpdateCube”,修改为白色的Cube预制。(注意可寻址地址不要)

  2. 生成热更补丁
    Build选项下选择,Update a Previous Build,点击之后会弹窗

    选择需要热更的平台的addressables_content_state.bin文件:

    这个文件就在工程的AddressableAssetsData文件夹下,是每次打包资源生成的:

  3. 上传热更补丁
    和上传资源步骤基本一致,1选择文件夹,2上传资源,3新建版本,4发布资源

  4. 检查资源状态
    上传完成后,可以到后台看到资源的版本信息了:

  5. 重启Demo,实现热更效果,Cube变为白色的:

以上是关于Unity资源热更新--资源管理Addressable的主要内容,如果未能解决你的问题,请参考以下文章

unity引擎热更新流程(主要是资源加载方面)--unity+tolua

Unity资源热更新--资源管理Addressable

unity3d的资源管理和热更新方案

unity3d的资源管理和热更新方案

Unity热更新代码

unity 代码热更+资源管理框架总结