Addressable使用心得

Addressable继承了assetbundle 在unity2017之后官方开发的资源验证流程,做到在游戏运行中读取和更新资源不用关心bundle以及hash。

 

不是初级教程,初级教程网上很多,这里算是补全一些使用的重点和细节

addressable group 这个工具 去bilibili看教程 很快就会了,这里主要是笔者自己的使用心得

 

快速入门

Addressables.InitializeAsync; 初始化

Addressables.CheckForCatalogUpdates;检查网络端的资源表

Addressables.UpdateCatalogs 下载对应资源表

 

Addressables.GetDownloadSizeAsync 检查要下载的资源所在的bundle还有依赖的bunlde的大小

Addressables.DownloadDependenciesAsync 下载资源和依赖的bundle

Addressables. LoadAssetAsync 从加载资源(具体资源同步流程看资源表章节)

AssetReference 可以直接用于选择加入addressable groups里的物体

 

简单的资源加载和更新函数都列出来了,其他unload的资源管理的自己琢磨把,我也没琢磨过。

下面是Addressable的新特性

 

Catalogs 资源表

Addressable好在catalogs,也难在catalogs, catalogs很重要,所有资源都围着catalogs.

基本上如果出现了难以理解的错误,不是catalogs和资源对不上,就是catalogs没下到。

 

官方将bundle的hash还有bundle里的依赖全写在catalogs里。

 

Catalogs是一张资源表,它在你build bundle的时候创建,对整个Addressable极为重要.

 

游戏在用Addressable加载资源的时候会根据资源地址检测资源在哪个bundle,然后看看当前bundle是否存在,不存在就上网下,然后检查bundle自身的hash直和catalogs里的是否一致,一致就直接读取本地资源,不一致就上网下,下不到就报错,你有老资源也不会读取。它只认资源表

 

当你打开build remote catalogs,就支持了网络更新资源表。

而不打开build remote catalogs, 可以下网络的资源但是不能热更,这里说的是出包的之后,就只能通过本地的catalogs下载固定的资源,并且下的时候还会校对hash,crc,你替换资源也没用,尝试关闭hash,crc会出错。所以不用想着用addressable系统去更新资源表里没有的资源了,要想那么做,只能另外用assetbundle

 

如果你不激活disable catalog update on startup,那么每当你第一次初始化Addressable. InitializeAsync 的时候,(如果你不调用 InitalizeAsync,那你用Addressable的任意功能依然都会自动初始化)会自动上网拉取资源表,如果你关闭自动拉取,那么你得用CheckForCatalogUpdates和UpdateCatalogs去主动下载资源表。

 

 

依赖

GetDownloadSizeAsync和DownloadDependenciesAsync 里面参数是具体的资源地址而不是bundle的组名,网上教程都没说清楚。

 

如果本地有依赖对应的资源,就算再其他bundle里,也不用你去主动去管理。直接实例化就行

但是,如果那些依赖在本地没有资源,你不使用DownloadDependenciesAsync无法自动下载其他依赖的bundle

 

DownloadDependenciesAsync多次使用也没效果,本地资源表和资源对的上它不会下东西

 

Build Bundle的时候会自动将需要依赖的次级资源加入到对应的bundle里,比如,如果你一个group里有个cube.prefab,cube上有材质球和贴图,而你并没有将材质球和题图加入到bundle列表里。它打包的时候会自动将材质球和贴图加进去。如果你材质球和贴图已经在其他bundle group里了,那么不会重复,资源永远只有一份。所以你需要DownloadDependenciesAsync确保所有依赖的bundle都在本地。

 

 

 

热更新

热更新需要用到check for content update resdriction,你每次build bundle的时候它都会更新,当你需要热更新的时候,使用check for content update resdriction, 去选一个bin文件,它会告诉你相对上一次的改动,是否有本地资源在列,然后自动把本地资源提出来新建一个组,这时候你不用build,build是完全重新构建,你需要增量更新 update previous build 去选那个bin文件。运行一下它会打增量包。

 

 

实例化

不要直接InstantiateAsync 要先load出来再instantiate,不要因为异步的关系,有可能导致你关掉运行模式回到编辑模式后,实例化依然再继续,然后就出现在你场景里了

 

 

Bug:1.7.4资源表如果开远程,那么就算设定了初始化不检测,依然会连一次网络检测;

DownloadDependenciesAsync 有时候速度太快 它的task会变空,在await导致报错,要处理一下。

原文地址:https://www.cnblogs.com/Persona/p/12611288.html