Addressable

实例化和卸载必须要一一对应,否则该物体会一直在内存中,除非退出程序

AddressableAssetSettings

使用

第一步进入AddressablesGroups面板
在这里插入图片描述

创建一个远程组将打包路径和加载路径设置为Remote,选择更新限制

CanChangePostRelease 后续更新资源的话全量更新(直接替换旧资源),在发布后,允许被修改.与静态Group相对,这个Group对应的AB包,是可以在后续进行覆盖更新的,相对于增量更新,整个AB包的覆盖更新可能会让未改动的资源也重新下载.
CannotChangePostRelease后续更新资源的话增量更新(不改变旧资源包,使用新资源包加载改变的内容),在发布后,无法被修改.就是说我客户端本地的这个Group中的AB包,都不能被修改了.所以只能通过这种增量更新的方式,另外创建一个Group,把修改后的资源放在这个新的Group中,然后重新打包AB,然后通过重写catalog文件,告诉客户端这个资源现在已经在这个新的Group中了,不要再去老的Group中加载了.但是老的资源依然还留在之前的那个AB包中。打包后,可非静态AB包都被覆盖了,而静态的AB包都没有被修改,因为静态包不允许被修改的,已经变为增量更新,生成了一个新的ab包,存放在了远程更新目录.
在这里插入图片描述

打包模式默认为同一个组打成一个AA,如果要分成不同AA,修改BundleMode
在这里插入图片描述

PackTogether:整个打包成一个AB包
PackSeparately:每个Group分别打包成AB包
PackTogetherByLabel:根据Label来决定哪些资源打成一个AB包

3种运行模式
在这里插入图片描述

检查AddressableAssetSettings

在这里插入图片描述

Profile :配置文件,配置本地/远程加载打包地址
DisableCatalogUpdateOnStartup:勾选上,可以禁用自动更新catalog文件,勾选的目的是为了我们自己控制catalog的更新时机
BuildRemoteCatalog:要通过AA系统更新资源,则必须勾选这个选项,在构建AB包时会生成对应的catalog文件,来记录AB包的hash值和地址
BuildPath:只有勾选BuildRemoteCatalog后才可以配置,是catalog文件的生成目录
LocalPath:勾选BuildRemoteCatalog后才可以配置,这是catalog加载地址,发布APP后,APP会通过这个地址来更新catalog文件

分析重复资源,Tools/Analyze打开,
这时会弹出一个窗口,点击Analyze SelectedRules,
在这里插入图片描述

第一次打包
在这里插入图片描述
后续

检查静态组增量资源
后续资源更新需要用到check for content update resdriction,你每次build bundle的时候它都会更新,当你需要热更新的时候,使用check for content update resdriction, 去选一个bin文件,找到bin文件(Assets\AddressableAssetsData[BuildTargetPlatform],注意当前打包的平台,选择好后会打开一个窗口。会显示跟上静态组对比,。如果有变化,点击ApplyChanges,系统会自动给新的内容创建一个Group,如果没有忽略
在这里插入图片描述

在点击Build/Update a Previours Build,找到对应平台的bin文件就可以更新AA包了
在这里插入图片描述

API:

Addressables.InitializeAsync; 初始化
Addressables.CheckForCatalogUpdates;检查网络端的资源表(hash)

注意这个API我这边测试有bug,返回长度的不管怎么样都是返回0,然后导致本地无法跟远程的资源表进行同步,加载的时候都是根据老的资源表进行加载。然后远程如果没有的话就会报错,在网上找了一下,好多人都有这个问题,官网知道这个问题也是说反馈给开发组。没有后续,不知道是什么情况。

Addressables.UpdateCatalogs 下载对应资源表
加载Addressable场景:Addressables.LoadSceneAsync();
卸载Addressables场景:Addressable.UnLoadSceneAsync();

获取Addressable大小:Addressables.GetDownloadSizeAsync();
参数:地址/Lable或者AssetReference

下载Addressable:Addressables.DownloadDependenciesAsync(“default”);
参数:地址/Lable或者AssetReference

删除AA:Addressables.ClearDependenciesAsync();

加载单个AA对象:Addressables.LoadAssetAsync(“地址”);

加载实例化对象:Addressables.InstantiateAsync(“地址”);

加载多个AA对象:通过Label加载
用于加载单个标签:Addressables.LoadAssetAsync(“lable”,null);
用于多个标签:Addressables.LoadAssetAsync(new List{“lable1”,“lable2”},null,MergeMode);
MergeModel:合并模式
UseFirst:取得第一个lable的资源
Union:所有lable的资源并集
Intersection:所有lable的资源交集

热更流程

首先调用Addressables.CheckForCatalogUpdates(false),这一步先去服务器请求hash文件跟本地对比,检查catalog文件是否需要更新,返回的字符串列表长度大于0,说明需要更新,就调用Addressables.UpdateCatalogs(catalogs,false)获取需要更新的key值,访问了hash和json两个文件,代表本地的这两个catalog文件到达最新,在调用Addressables.GetDownloadSizeAsync(updateKey)获取下载大小,如果大小大于0,就调用Addressables.DownloadDependenciesAsync(updateKeys,Addressables.MergeMode.Union)下载资源

Catalogs资源表:

Catalogs是一张资源表,当用Addressables加载资源的时候会根据资源地址在哪个bundle里,在判断当前bundle是否存在,不存在从服务器下载,然后检查bundle自身的hash值和Catalogs里的是否一致,一致就读取本地资源,不一致就从服务器下载,无法获取就报错,就算有老资源不会读取,只认资源表。
勾选BuildRemoteCatalogs支持网络更新资源表

不打开buildRemoteCatalogs,可以更新网络资源但不能热更,只能通过本地Catalogs下载固定的资源,并且下载的时候还会校队hash,crc,替换资源也下不到新资源,所以不用想着用Addressables去更新资源表没有的资源。
如果不勾选disableupdateonstartup,那么第一次初始化Addressable.InitializeAsync的时候(如果不调用,那当你调用Addressable的任意功能依然会自动初始化)会自动从服务拉取资源表,如果关闭自动拉取,需要用checkForCatalogUpdates和UpdateCatalogs主动下载资源表

注意:

1,更新资源要使用Update a Previous Build来更新AB包,如果使用New Build重新打包,也会重新生成catalog文件,而之前发布的应用是无法下载新的catalog文件

2:如果编辑器下出现默认shader材质加载都出问题了(粉红),可能是缓存的问题,删除Library文件,重新加载项目

补充:ScriptsObject可以当做资源热更

Windows编辑器下载AA缓存放在Unity的Caching下,目录为“C:\Users\UserName\AppData\LocalLow\Unity\ProjectFolder”

Addressable编辑器修改,继承BuildScriptPackedMode

API参考:https://blog.csdn.net/xjm1018/article/details/119653221?utm_medium=distribute.pc_relevant.none-task-blog-2defaultbaidujs_title~default-0.no_search_link&spm=1001.2101.3001.4242.1

猜你喜欢

转载自blog.csdn.net/weixin_44806700/article/details/121556211