找回密码
 立即注册
查看: 238|回复: 0

Unity AssetBundle初体验

[复制链接]
发表于 2022-9-30 17:28 | 显示全部楼层 |阅读模式
AssetBundle是Unity进行资源打包的格式,目前比较流行的Addressable也是基于AssetBundle的。将资源构建AB包的过程可参考官方文档,需要把脚本在Editor文件夹下。在打包的过程中,标签为None的资源不会被打包。构建出来的AB包是一个二进制文件,可通过UnityEditor目录下的Data/Tools目录下的WebExtract和binary2text工具将二进制文件转换为文本文件以供阅读。
当资源之间存在依赖关系时,如果先将被依赖的资源打包会节省包体大小,具体步骤参考官方教程。实际测试结果为只要给被依赖的资源打上标签,一次性打包也能实现上述效果,不需要多次打包。
在做实验的时候我遇到一个问题,是由于prefab的嵌套造成的。实验设计如下资源引用关系:cube_parent_1、cube_parent_2、cube_child为三个立方体prefab,引用关系为cube_parent_1->cube_child->material、cube_parent_2->cube_child->material,即cube_child为cube_parent_1和cube_parent_2共同的子节点。cube_parent_1、cube_parent_2、cube_child的AssetBundle标签分别设置为parent_1、parent_2和child,下面开始进行测试:
Case1:
设置material的标签为None,即不进行打包,可得到如下结果。可以看出cube_child打出来的child为27kb,其中包含material资源的拷贝,存在冗余。


Case2:
设置material的标签为mat,可得到如下结果。可以看出cube_child减少了包体大小,避免了资源冗余。material被打包为mat,大小为26kb。


Case3:
设置material的标签为None,先打包cube_child,再打包cube_parent_1、cube_parent_2,可得到如下结果:


通过实验可以看出child先打包,parent_1和parent_2后打包,并且已经存在的AB包并不会再打一遍。尽管cube_parent_1和cube_parent_2的子节点均为cube_child,但两者打包后仍然包含冗余的cube_child。目前猜测区别在于cube和material是引用关系,而cube之间是父子节点的包含关系,导致资源打包存在冗余。
网上查了一下后发现是因为prefab的嵌套和引用等关系是编辑器时才有效的,而打AB包的时候,这层引用关系就没了,参考链接。为了进一步进行验证,使用脚本中成员变量的方式进行引用,测试AB包大小。新设计如下引用关系:cube_parent_1->cube_child_1和cube_parent_2->cube_child_2。具体步骤为创建一个脚本,向其中添加一个成员变量,类型为GameObject,然后将脚本挂在cube_parent_1和cube_parent_2上,在面板上分别将变量指向cube_child_1和cube_child_2。然后设置cube_parent_1、cube_parent_2、cube_child_1的标签,设置cube_child_2的标签为None。打包后可得到以下结果:


可以看出cube_parent_1引用了cube_child_1,由于cube_child_1先进行了打包,所以cube_parent_1的大小缩小了。而cube_parent_2引用了cube_child_2,由于cube_child_2没进行打包,所以cube_parent_2的大小没有变。总结起来就是通过脚本建立的依赖关系在打包时是会保留的,而编辑器里的prefab嵌套在打包时不会保留依赖关系,直接进行拷贝。后面一想拷贝也是有道理的,因为嵌套的子prefab可以改属性,改了属性后子prefab就和原来的prefab不一样了,直接拷贝而不是引用是最省事的。
之后又测试了Addressable,毕竟是相对成熟的解决方案,没出现AssetBundle的prefab的嵌套打包问题,即没有出现资源冗余情况。而AssetBundle是怎么设计打包的有机会可以看看源码,最新版本的Unity应该还没修复这个问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Unity开发者联盟 ( 粤ICP备20003399号 )

GMT+8, 2024-7-4 09:29 , Processed in 0.134249 second(s), 26 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表