Unity Addressables可寻址资源管理的学习笔记

        前不久刚刚换了工作,由于项目中使用到了Addressables,故而花了一些时间简单的学习了一下这个Unity新出的资源管理系统,其实也不算特别新的技术,不过依然还是有坑的,这个等下会说到。
        首先,我最早听到Unity新出这个资源管理系统的时候,我的理解有一个错误,我一直以为这是一套不同于AB的全新的管理系统,其实不然,它本质基于的Bundle包还是和AB差不多,它所做的工作更多是对AB包的管理,这里我先回顾一下Unity加载资源的以前的几个方式,一种是把资源都放在Resources目录下,然后通过Resources.Load来加载,但是这会导致所有在Resources目录下的资源都被打到最终我们打出的安装包里去,而且在游戏或应用初次启动时会把他们全部加载,也就是说里面的内容越多,花费的时间也越长,这直接导致了启动时可能会有一段时间黑屏,就是在加载Resources里的资源,所以一般商业项目没人会这么做,Resources目录下就算有也是极少量的一些资源,所以放Resources一般做一些Demo或者轻量级的项目可以使用。而为了避免这个问题,通常项目里正确的资源加载通常都会使用AssetBundle来进行管理,它的优势就是可以将资源打成包放在服务器也好,或者放在本地,在需要的时候从服务器下载下来,然后再去加载,并且可以实现一套基于它的热更新资源的机制。所以一般商业项目都会使用AB,但AB在使用的时候整个资源的打包策略,以及资源加载释放策略都需要你自己写一套管理器来进行管理,例如怎么归类,何时加载AB,合适释放AB,要考虑的方面也多,比如加载某个资源你要知道先加载哪个AB包,再加载里面的资源,释放的时候还有没有可能还有资源在用AB包里的资源。而这次新推出的Addressables主要解决的就是资源管理的问题,它可以通过一个key(默认是资源路径),或者label直接加载资源,资源一旦被标记为Addressables的,无论将来它在什么位置,你都可以通过它的key加载到,如下图资源我们直接可以用Addressables.LoadAssetAsync<GameObject>()这个API来加载,里面传入key就行

        下面说一下大概的使用方式,具体怎么安装不在赘述,安装完后可以从Window的AssetManagement的Addressables里打开对应的几个面板,Groups ,Profile和Hosting等
        首先说Groups,Groups主要就是如何对你的资源进行分组,也就是说打包策略这里给了你一个管理的工具,但是事实上,如何进行资源分类还是要由你来做的,所以这也是为什么我觉得Addressables还是不够完全的智能的原因,它的分组除了你可以直接在这里进行创建然后把资源拖拽进来,它还是提供了可以用代码的方式来进行分组的API的,也就是说,通常实际使用除非你的资源分类比较简单可以直接手动拖拽管理,事实上,更推荐的做法还是自己制定一个规则,然后写一个进行分组的工具来处理,我个人觉得这点上其实并没比AB好太多,另外需要说明的是,并非是你放在一个Group里的资源就打成一个bundle,这只是默认的选项,事实上你还可以更改它的配置,实现每个group里面的每个资源打一个包

这里有三个选项,默认就是一个Group一个包,还有两个分别是separately 每个资源打一个,还有by label 按照标签分类打包,上图里的配置文件是在你创建Group的时候,会自动生成在AddressableAssetsData/AssetGroups目录里的,你可以在这个目录下找到来配置,也可以用Groups面板里点击Group来管理,本质是一样的。说下几个重要的配置,BuildPath是说你打包时把他放在哪个目录里,LoadPath是加载时在哪个目录,而里面的目录设置又是在Profiles那个面板里面去配置的,也就是说你可以配置多个Profile,每个Profile都需要你配置5个属性,分别是打包的平台(这点也和AB一样不同平台的包要重新打),本地打包的路径,本地加载的路径,远程打包的路径,和远程加载的路径。再回到刚才的Group的配置就可以使用它们来指定对应的路径了,这样就能区分出你打的这个包究竟是放本地还是远程,他们放在哪,再下面比较重要的配置就是Compression压缩格式,以及UseAssetbundle cache是否资源缓存到本地,如果你本身资源就是打在本地的,这个就没必要勾选了,因为本来你就放在本地,再缓存一份,就浪费空间了,在最后有一个UpdateRestriction,这里只有两个选项 Cannot Change PostRelease就是不能远程进行更新的资源,也就是所谓的静态资源,Can Change PostRelease就是可以进行远程更新的资源,也就是动态资源。这里有一个动静资源的概念,按照官方文档的说法,静态资源是那些你不想要被更新的资源,动态资源,是那些你想要被更新的资源。所以你在分组的时候,需要自己分清楚。
       然后再说一下Settings,这个是整个Addressables的配置

        主要是DisableCatalogUpdateOnStart,这个配置勾选的话,那么在程序一开始运行的时候它不会自动的去更新资源,也就是说更新资源需要手动调用来执行,而通常这个操作肯定是交友程序来控制的,毕竟你需要询问用户是否要更新,而这就要说一下我在1.8.5版本遇到的一个坑,不知后续版本有无修复,包括官方论坛都有人提到了,就是Addressables.CheckForCatalogUpdates这个API,按照官方的说法这个API用来检测有没有新的catalog文件需要更新,然后返回一个异步的句柄,里面的实际的Result就是需要更新的文件,但是你会发现上来调用这个API返回的始终是空的,即便你已经更新了资源,按照官方的说法Addressables是需要初始化的,但是所有的API在执行前都会检测有没有初始化过,没有的话都会帮你调用一下初始化,这也是为什么我在做demo测试的时候每次先做了Addressables.DownloadDependenciesAsync以后Addressables.CheckForCatalogUpdates就对了,因为Addressables.DownloadDependenciesAsync帮你做了初始化操作,为了解决这个bug,需要你在检查catalog更新前自己调用Addressables.InitializeAsync。接着继续说BuildRemoteCatalog 只有勾选这个,那么打包的时候他才会打包远程资源,否则只会打包本地资源,其实只打包本地资源,有时候只是为了方便自己本地测试,在做正式包发布的时候一定要打远程的,SendProfilerEvents勾选的话他会发送对应的事件消息,这个主要是做资源更新的分析的时候,你可以用代码自己来监听这些事件来做分析用,目前我还没接触到,先不做展开,常用的就这么几个配置。
       然后说说Hosting这个配置面板,这个主要是Addressables为我们提供的一个类似于本地文件服务器的工具,让我们用来本机测试远程下载,默认打出的文件目录放在你工程目录下的ServerData目录里,按照你的平台目录划分。

enable勾选了以后就启用了。

        知道了这些配置的作用以后,配置好相关的参数,再来说说怎么打包,就在Groups面板里有个build,然后注意,如果是第一次打包,应该选择NewBuild,而如果是做更新资源的打包那么你应该先选Tools里的Check For ContentUpdate 来检测一下你有没有静态包需要移动的,因为静态包如果要做更新,只能把他们新建一个分组来放进去了,这里就是前面提到的静态资源的概念,因为原本静态资源是你不想被热更的,如果你要热更,那么只能把他单独放在一个新的分组里新打一个包了,不能直接通过原来的包来更新,这也会造成资源浪费,选完了Check For ContentUpdate,再选build里的Update a previours build而这两个操作都需要你指定对应平台打包的bin文件,bin文件在你本地打包的目录里对应的平台目录里有,在AddressableAssetsData下对应的平台目录里也有一份,打包的时候需要指定它,这样才能知道你是针对哪一个打包的bin做更新打包。而以上这些操作也都可以通过代码的方式来做,具体的可以看官方API文档,也就是说实际使用的时候可能还是需要自己写一个工具来做这些事情。
        以上就是我目前学习到的Addressables的使用,关于分析那块我目前还没接触到,等以后用到了或者学到了,考虑再做一个补充。

fantasycoding.net 2016-2024 © All rights Reserved京ICP备2020039454号-1