子预设体勾选了同步,多次切换预设体编辑查看之后,大预设体报错打不开

这是一个很严重的bug,我在编辑器操作prefab好好的,主要是查看,主界面预设体和子级预设体来回切换过几次,期间还通过编辑器脚本resetInEditor(),进行过脚本属性的挂载,一切都很正常,就不知道哪次双击切换了预设体之后,突然主界面的预设体报错打不开,提示节点已被destroy之类的错误,重启多次仍然报错无法打开。

错误产生的直接原因,主界面预设体包含一个子预设体,并且在主界面中,把子预设体勾选了同步。

同步勾选之后没有什么问题,我勾选了之后还特地马上测试了一下,修改子预设体将某个节点隐藏,主界面的预设体可以保持同步。

主界面的预设体报错完全打不开,我慌了,因为界面文件还在本地开发,没有提交到版本控制,如果预设体坏了,意味着我需要重新拼界面,但是我还是想自救一下。以下是自救的过程,最后成功恢复了界面。

首先我用文本打开主界面预设体,搜索子预设体的uuid

image

注意这里有一个__id__:67的属性

在主界面预设体中,我已经将这个节点绑定到了脚本的属性@property上面,接着我再次搜索这个绑定的属性名称

上图的selfHead就是脚本里面声明的property属性,我发现这个__id__是70,感觉有点不对劲,为什么不是前面的67(第一个图中圈选出来了)
并且我搜索了一下"id": 70,发现就只出现在这一处,也就是说70的id是没有任何对应资源的

然后我把下面的
“selfHead”: {
id”: 70
}

手动改成

“selfHead”: {
id”: 67
}

保存之后,回到编辑器,再次双击主界面的预设体,它竟然成功打开了,只不过子预设体已经丢失了,只有一个同名的空节点。

那么这个id为什么会对应不上呢?

我百分百保证,在之前没有手动改过预设体的文本文件。也不知道这个__id__的作用,在编辑器脚本中也没有引用过这个__id__属性。
唯一可能有关联的操作就是,我不是手动拖这个节点绑定到@property属性上去的,而是通过主界面挂载的脚本中的resetOnEditor()函数执行的绑定,但这个并没有涉及到__id__的访问。

所以,这是一个未知的bug,而且后果比较严重,直接导致预设体打不开,编辑器假死。

现在我已经不敢再去勾选预设体同步的选项了,真怕它把我的界面搞坏。

希望官方能解决这个问题。

补充一句,子预设体节点__id__对应不上,有一种可能的原因

主界面中的子预设体,一开始是没有勾选同步的,在用了一段时间后,因为改过子预设体的prefab资源,我才将子预设体勾选了同步,并且在确认同步对话框里面选择了回退,因为我想把主界中的子预设体实例始终与其prefab文件保持一致。

上面这一步同步确认对话框有三个操作按钮,分别是应用取消回退,我选择了回退

是不是这个回退操作使其__id__变了呢,我操作回退之后还特地按Ctrl+S保存了一下,但是有一个很奇怪的问题,当我双击别的预设体或者场景文件去看别的界面时,它又出现一个提示框,再次询问我应用还是回退,此时这个对话框只有应用回退两个操作按钮,注意,没有取消按钮,我当时被这个对话框整懵了,为什么又要选择一次,我感到有点莫名其妙,不敢选,直接点了提示框右上角的关闭按钮。

总之这个应用回退操作逻辑设计的比较复杂,搞的我有点不敢选,总感觉它容易出岔子,实际上它还真的出了岔子,烦人。

呵呵,又出现了,百分百能重现,

预设体同步在unity里面很平常的一个功能,平常到完全忽略它的存在感的功能,怎么到了cocos就这么闹心,动不动把编辑器搞崩

image

重现步骤:
预设体A包含子预设体P
预设体B也包含子预设体P
我先双击打开预设体A,然后将其中的子预设体节点P设置为同步,此时出现上图的弹窗,我选择了回退
然后我双击打开预设体B,也将其中的子预设体节点P设置为同步,此时出现上图的弹窗,我选择了回退

其实到这一步我的操作就已经完成了,按Ctrl+S保存了预设体。

问题来了,我再次双击打开预设体A,这个时候出现了下面的弹窗

image

其实上面这个弹窗我是不理解它为什么会出现,我的操作已经完成了,它为何又提示我选择一次,我再次选择了回退

选择完之后,编辑器就出现报错,报错信息就是上一条回复的红色错误信息,然后编辑器就假死了。

希望官方排查问题,这是一个很严重的bug,不仅把编辑器搞崩,还把用户的预设体搞坏,实在太糟糕了