BuildAssetBundleOptions.DisableWriteTypeTree参数导致AssetBundle在Editor加载时闪退

发布时间 2023-03-27 22:54:17作者: 小小钊

问题

  • 从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的信息,优点如下:

    1. DisableWriteTypeTree能够减小包体的大小


    LZMA格式下,大小差了3K。

    1. DisableWriteTypeTree能够减少内存占用



    图一图二分别是开启eWriteTypeTree和关闭eWriteTypeTree,两者在内存上相差16k,而ab内只有一个小预制体。

  • 参考资料
    UWA问题DisableWriteTypeTree描述