前言
Addressables的基础看这篇文章
最近公司在写新的框架,决定放弃老的bundle打包方式,使用Addressable,因此我要捋顺新的打包方案,并且解决所有疑问。
正文
打包的最终目的是:build出一堆Bundle文件,而哪些因素会影响出包结果,总结一下有3个关键因素和1个非关键因素
关键因素1:AssetGroups自定义AssetGroup
![](https://i-blog.csdnimg.cn/blog_migrate/087eb0b6fdf464537e45a913d8b7f5bf.png)
关键因素2:BundleMode
![](https://i-blog.csdnimg.cn/blog_migrate/f83be8e0375b6dfeef3268c83e0aefa3.png)
关键因素3: 自定义Label
![](https://i-blog.csdnimg.cn/blog_migrate/4adb8950753a8c8f7b5fb72c69aceabf.png)
一张图就可以看懂这三项如何使用
![](https://i-blog.csdnimg.cn/blog_migrate/6e087665647492466690dc2a22099613.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1ad77ed29759d2c4ec79a378f203e65d.png)
修改该Group的 Bundle Mode
之前是Pack Together,现在修改成Pack Together By Label,执行增量打包
![](https://i-blog.csdnimg.cn/blog_migrate/cd8b1e463c452501d788bc395289bfd3.png)
可以发现老的bundle文件还在,但增加了新的三个bundle文件,根据名字很明显可以看出,all是老的bundle,代表没有Label,而新的bundle根据label分别创建了三个bundle,分别是无label模式,还有两个texture_1 texture_2。
【提问】如果把不同的Group内的资源设置成相同的Label是否会打进同一个bundle,测试发现,不会进入同一个bundle
![](https://i-blog.csdnimg.cn/blog_migrate/38a73d5a0289fad2c972a3e69643477d.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b6da9622e18041613aed631f66d1c0fc.png)
非关键因素1:Group的一项设置> Content Update Restriction
为何前三项是关键因素,而这一项是非关键因素?
答:该选项在首次打包前就要确定好要选择哪个,以后增量打包不能变,变了会出错(除非是完整出包),所以说包的内容在不断变化,但该选项不能变。热更资源就选动态资源或不勾选Prevent Updates,用默认选项。如果是极少热更的资源可以设置为静态。
老版本的Addressable有两个选项
Cannot Change Post Release:静态资源
Can Change Post Release:动态资源
![](https://i-blog.csdnimg.cn/blog_migrate/494bbbdd3fab9c7118f456e8ba40890c.png)
新版本
![](https://i-blog.csdnimg.cn/blog_migrate/dc1229811884cb4c62f953b12c8b467d.png)
Prevent Updates是否阻止更新
请注意!!!
无论是新版本还是老版本,首次打包一定要确定好这个Group的Content Update Restriction选项并且在以后的版本中不允许更改,除非以后要再次完整的打包才可以更改。下面做个测试,看看Content Update Restriction到底有什么用
默认情况下是不勾选Prevent Updates或Can Change Post Release:动态资源
如果勾选了Prevent Updates或者是使用了Cannot Change Post Release:静态资源,资源发生改变并且执行增量打包时,你会看到Addressables Groups界面各种黄灯警告
![](https://i-blog.csdnimg.cn/blog_migrate/63cd5cbed7e846754e8acc1c08d4a3e7.png)
Unity会提示你需要把改变的资源移动到一个新的Group中,并且你可以自己定义该Group的名字
![](https://i-blog.csdnimg.cn/blog_migrate/9bb404aecbbf7f55595034d0d43dc7b9.png)
当你点击ApplyChanges后,被警告的资源就会跑到这个新的Group中,如下图所示。
![](https://i-blog.csdnimg.cn/blog_migrate/e4d1de57b938ddda64a65148ff42ddf1.png)
官方建议我们把项目中不常改动的资源设置为静态资源
打包粒度控制
接下来要考虑的问题是,Bundle的粒度要如何控制,假设我把所有资源放到一个Group中,那一个微小的改动就要下载整个bundle包,这肯定是不科学的。
那可否让每一个资源独立成一个Bundle,虽然这么做可行,但是考虑到效率也是不建议这么做的。颗粒度过小要考虑到IO发烫的问题。
有了上面两个疑问,那解决方案就比较清晰了,方案是:有的资源独立一个bundle,有的资源按文件夹打成一个bundle。被多个资源引用的公共资源,按文件夹打成一个bundle或每个资源独立一个bundle。
疑问:哪些资源需要按文件夹打包,哪些资源要独立一个bundle?
先来看看所有要打包的东西有哪些:
Atlas、Sprite、Lua脚本、Shader、Setting(Unity序列化Asset)、txt配表或者bytes配表数据、视频、音频、字体、预设(3D角色、特效、2DSpine、Live2D)
打包资源就是上述文件,而怎么区分用哪种策略呢
类型 | 是否依赖其他文件 | 以文件/文件夹打包 | 纯被动依赖 | 引用文件 |
Atlas | ✅ | 文件 | ✅ | |
Sprite | 否 | |||