首先描述一下崩溃的现象:
因为之前使用的版本一直都是Unity2020.3.0(LTS),是一个相对稳定的版本,后来因为想尝试一下新版本的一些新特性,就讲Unity升级到了2021.2.7,但在后面的使用过程,发现新版的Unity总是在导出资源之后(生成AB包)的第一次运行后崩溃,再次运行依旧崩溃,只有重新导出一次资源再运行之后就不会出现崩溃问题。虽然打出的apk包之后真机运行并没有什么问题。但是这种总崩溃的现象总是让人觉得很难受,所以我开始排查这个奔溃出现的原因。(下图为崩溃弹窗)
问题排查过程:
根据现象可知问题出现在AB资源换加载时候,尝试在一个空项目中做一个简单的预制,其中只存放一个简单的Cube然后导出AB资源-->加载,并未出现崩溃现象。那就证明加载的逻辑代码是没有问题的,问题出现在AB资源上。
接着开始定位是哪个组件出了问题,将需要导出的资源通过对半删的方式去挨个导出资源-->加载,最终定位到TextMeshPro这个组件上,当你的AB资源中有这个组件时,就会出现崩溃的现象。至此问题已定位。
问题解决:
首先给出解决办法:
- 因为问题出现在TextMeshPro这个组件上,最简单暴力的解决方法就是换掉它,不再使用TextMeshPro这个组件,当然这并不是最好的解决办法。
- 首先找到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