prefab文件在某些情况下可能会损坏。

今天在整理旧的的一个项目。cocosCreator3D 1.1.0的项目。主要操作就是很快速的打开预制件,打开场景之类的来回切换,删除一些节点之类的。然后当我打开我的其中一个预制件的时候编辑器是可以正常的工作的。如下图所示,各种编辑都是没问题的。
但是底下却报错了说

[Scene] Script “8fe55knG4ND7JCp5ElWCJqJ” attached to “byteCustomButtons” in prefab “quickGunPage” is missing or invalid.
但是我的这个预制件的节点树上其实根本就没有这个 byteCustomButtons 节点的。于是我直接用文本编辑器打开这个预制件。发现了不得了的事情。在这个Json文件里发现了这个玩意
···
{
type”: “cc.CanvasComponent”,
“_name”: “”,
“_objFlags”: 0,
“node”: {
id”: 244
},
“_enabled”: true,
“_priority”: 1,
“_targetTexture”: null,
“_clearFlag”: 0,
“_color”: {
type”: “cc.Color”,
“r”: 0,
“g”: 0,
“b”: 0,
“a”: 0
},
“_renderMode”: 1,
“_id”: “2fie7WDkpAroK3AI2I9Adg”
},
···
一个Canvas组件。然后我发现这个Canvas组件不是我场景上的吗?然后发现居然整个Scene场景的节点都保存到这个 预制件里了。真是要死。最后附上这个预制件
quickGunPage.prefab.zip (57.1 KB)

而且我发现在场景文件和预制件文件的Json格式里可能存在一些没有父节点的节点。这些节点因为没有父节点。所以无法在节点树上看到和编辑,但是他们确实存在,并且会占据你的储存。

你好,需要再发一下这个文件的 meta 文件

{
“ver”: “1.0.28”,
“importer”: “prefab”,
“imported”: true,
“uuid”: “1f0e55a9-7e55-45d8-8c0d-aa2908bd65fb”,
“files”: [
“.json”
],
“subMetas”: {},
“userData”: {}
}
meta文件里就是上述内容啦

你好,理一下错误数据的形成思路:
1、编辑 quickGunPage.prefab
2、根节点 quickGunPage 挂载一个 Script 脚本组件
3、Script 里新增一个属性 LabelParams 数组,类型为 cc.Label 组件
4、场景中有一个 Label 节点的 cc.Label 组件被拖入了 Script LabelParams 数组里
5、点击保存 quickGunPage.prefab ,此时会克隆根节点 clone_quickGunPage_node,克隆节点的 parent = null
6、到此均为正常,以下开始产生错误数据
7、LabelParams[] 存了一个已被删除的节点 Label , Label 为已删除是因为它的 parent = null
8、Label 的 _prefab.root 指向编辑中的 quickGunPage 节点,而非 clone_quickGunPage_node 克隆节点
9、由 quickGunPage 节点便带出了 scene ,scene 带出了所有节点和组件数据。

如下图错误数据:

脚本中引用了自身 prefab 已删除的节点或组件是否合理,或者改进编辑器对 prefab 数据的保存方式,待我们内部讨论下再回复你。
附上正确的数据,清空了 “type”: “57d23GeTxROxqLZEzb9gSkL” 这个脚本组件的 labelParams ,重新编辑保存就正常了。


quickGunPage.zip (4.8 KB)

1赞

谢谢解答啦:kissing:

在最新的编辑器未发布版本已测试了多种错误数据的情况,重新保存时都能有报错提示,重新加载时有阻止在运行时加入错误数据(但原始资源文件错误数据不会修正),并抛出警告。
请帮多留意下 prefab 编辑及保存的异常情况,给我们反馈,谢谢。

1赞