随笔-Unity部分版本加载AB资源时崩溃问题

        首先描述一下崩溃的现象:

        因为之前使用的版本一直都是Unity2020.3.0(LTS),是一个相对稳定的版本,后来因为想尝试一下新版本的一些新特性,就讲Unity升级到了2021.2.7,但在后面的使用过程,发现新版的Unity总是在导出资源之后(生成AB包)的第一次运行后崩溃,再次运行依旧崩溃,只有重新导出一次资源再运行之后就不会出现崩溃问题。虽然打出的apk包之后真机运行并没有什么问题。但是这种总崩溃的现象总是让人觉得很难受,所以我开始排查这个奔溃出现的原因。(下图为崩溃弹窗)

         

        问题排查过程:

         根据现象可知问题出现在AB资源换加载时候,尝试在一个空项目中做一个简单的预制,其中只存放一个简单的Cube然后导出AB资源-->加载,并未出现崩溃现象。那就证明加载的逻辑代码是没有问题的,问题出现在AB资源上。

        接着开始定位是哪个组件出了问题,将需要导出的资源通过对半删的方式去挨个导出资源-->加载,最终定位到TextMeshPro这个组件上,当你的AB资源中有这个组件时,就会出现崩溃的现象。至此问题已定位。

        问题解决:

         首先给出解决办法:

  1.  因为问题出现在TextMeshPro这个组件上,最简单暴力的解决方法就是换掉它,不再使用TextMeshPro这个组件,当然这并不是最好的解决办法。
  2. 首先找到Packages\TextMeshPro\Scripts\Runtime\TMP_FontAsset.cs脚本,找到一下代码的位置,将[SerializeField]修改为[NonSerialized],让其不可序列化。
   #if UNITY_EDITOR
        /// <summary>
        /// Persistent reference to the source font file maintained in the editor.
        /// </summary>
        [SerializeField]
        internal Font m_SourceFontFile_EditorRef;
    #endif

        这么修改的原因通过对资料的查阅得知是因为打包参数TypeTree导致的,因为插件中将m_SourceFontFile_EditorRef这个对象设定为了可序列化,但是又放入了 #if UNITY_EDITOR的宏编译中,所以在编辑器下运行时没有TypeTree信息,反序列化失败,直接导致了崩溃。

        下面的链接是在一个论坛中找到的问题说明及解决办法:

         链接地址:https://www.cnblogs.com/ogaligong/p/15632366.html

        (机翻加网络问题,所以看的比较费劲)

        链接地址:https://issuetracker.unity3d.com/issues/loading-textmesh-pro-prefab-from-assetbundle-crashes-editor-when-buildassetbundleoptions-dot-disablewritetypetree-option-is-used

        链接地址:https://answer.uwa4d.com/question/616a8e668f8c834241dfd78b

        最后的说明:其实我对第二种解决方式还是持有一定的观望态度,毕竟官方并没有给出这个问题的明确答复,及解决办法。但是通过这个办法确实解决了实际问题,还需要更多的试验测试去验证。如果大家的项目中用不太到TextMeshPro这个组件,建议大家去更换这个组件是最安全的解决办法。

猜你喜欢

转载自blog.csdn.net/zhangchong5522/article/details/123544990