BuildAssetBundleOptions.DisableWriteTypeTree参数导致AssetBundle在Editor加载时闪退
问题
- 从AssetBundle中加载Asset时出现"The file ‘archive:/CAB-… is corrupted.’Remove it and launch unity again![Position out of bounds!]" 如下图
解决方法
- 在打ab的时候使用BuildAssetBundleOptions.DisableWriteTypeTree这个选项,也会导致编辑器加载部分安卓 AssetBundle出现这个错误。将BuildAssetBundleOptions.DisableWriteTypeTree更改为BuildAssetBundleOptions.IgnoreTypeTreeChanges,即可避免这个问题。目前遇到的是TextMeshPro插件代码引起的,原因是TMP插件Editor下,会读取资源后进行反序列化,如果用DisableWriteTypeTree打包出来的ab,会导致反序列化失败,从而导致Editor崩溃。这个资源仅在Editor下会使用,所以在UnityEditor下才会导致崩溃。
深入拓展
-
BuildAssetBundleOption.DisableWriteTypeTree
在Unity 5.x版本中,AssetBundle在制作时会默认写入TypeTree信息(对应IgnoreTypeTreeChanges),这样做的好处是可以保证AssetBundle文件的向下兼容性,即高版本可以支持以前低版本制作的AssetBundle文件。但是在5.x以上的版本,Unity支持我们可以选择关闭TypeTree的信息,优点如下:
-
DisableWriteTypeTree能够减小包体的大小
LZMA格式下,大小差了3K。-
DisableWriteTypeTree能够减少内存占用
图一图二分别是开启eWriteTypeTree和关闭eWriteTypeTree,两者在内存上相差16k,而ab内只有一个小预制体。 -