写在前面
公司之前换了一次unity版本,从5.4.3提升到了5.6.4,这样就造成了一个问题。公司之前用5.4.3打包上架的安装包,如果你需要热更一个预制物体的话,这个时候你的工程又是在5.6.4版本打开的话,修改预制物体。然后热更上去的话。要么出现闪退的情况要么出现预制物体无法加载。

这里显示是unity的libunity.so的问题,查了一下可能是不能用高版本的预制物体在低版本的包里使用。然后在5.4.3编辑器下拖出在5.6.4编辑器下修改过的预制物体会出现如图:

当然还有一些自定脚本需要指定一些公有变量,也会丢失。问题差不多就会出现这些。使用的是UGUI,指定的图片也没有丢失。
解决方案
最开始是想要直接使用prefab文件,直接修改文本中的值就可以了。

那么正确的的文本结构是什么样的呢?
我们这里使用手动把名字丢失的gameobject加上,或者写一个小工具把高版本中的名字记录下来,然后再低版本中把记录读出来并赋值。

我们可以对比一下两个版本的prefab文件的文本结构,有一句是不一样的。就是serializedVersion的值。之前的版本是5,正确的版本是4。那么我们看看其他正确的预制物体的serializedVersion值是多少呢?正确的是4。这个的意思是序列化版本吧。如果我们把所有serializedVersion : 5改成4的话,是不是就正确了呢?实验结果是改完了确实正确了。这里的原理还没有看明白,网上也没有找到相应的资料。不过这样改了确实是对了。猜测应该是unity各个版本对预制物体的序列化的方式是不同,不能向上兼容吧。
这里解决自定义脚本公共变量丢失的方法:
我们可以在5.6.4版本中把以前的预制物体重新命名新建一个,然后把这个新建的预制物体导入新版本这里就可以了。
网友评论