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导致报错,要处理一下。