修复: 预制体序列化格式从场景格式转换为标准预制体格式
- 重写 scene-script.js 中 create-prefab 处理器,增加 9 步后处理管线 - 移除 cc.Scene、添加 cc.Prefab 包装器和 cc.PrefabInfo、清空 _id - 更新 UPDATE_LOG.md、注意事项.md 及 main.js 相关注释
This commit is contained in:
@@ -384,3 +384,29 @@
|
||||
|
||||
- **问题**: 插件重载或场景切换期间调用 scene-script 方法时,原始错误 `Error: ipc failed to send, panel not found` 信息晦涩,容易让用户误以为插件出现严重故障。
|
||||
- **修复**: 在 `callSceneScriptWithTimeout` 的回调中检测 `panel not found` 错误,自动替换为友好中文提示:`场景面板尚未就绪(可能正在重载插件或切换场景),请等待几秒后重试`。日志级别从 `error` 降为 `warn`。
|
||||
|
||||
---
|
||||
|
||||
## 预制体序列化格式修复 (2026-03-02)
|
||||
|
||||
### 1. `create-prefab` 序列化输出格式修复 (`src/scene-script.js`)
|
||||
|
||||
- **问题**: 通过 `create_prefab` 工具创建的预制体虽然不报错,但文件内容格式不正确,导致在编辑器中打开或使用时出现异常行为。
|
||||
- **原因**: `Editor.serialize(node)` 输出的是**场景格式**而非**预制体格式**,具体表现为:
|
||||
1. ❌ 数组首元素为 `cc.Node` 而非 `cc.Prefab` 包装器。
|
||||
2. ❌ 包含 `cc.Scene` 对象,根节点 `_parent` 指向 Scene。
|
||||
3. ❌ 所有节点的 `_prefab` 字段为 `null`,缺少 `cc.PrefabInfo`。
|
||||
4. ❌ 节点保留了运行时 `_id` 值(如 `"f6WlEh4IdCcKIheBW4zwk5"`),而预制体中应为空字符串。
|
||||
- **修复**: 在 `src/scene-script.js` 中重写 `create-prefab` 处理器,增加 9 步后处理管线将场景格式数据转换为标准预制体格式:
|
||||
1. 解析 `Editor.serialize()` 返回的 JSON。
|
||||
2. 识别并移除 `cc.Scene` 对象。
|
||||
3. 构建旧索引到新索引的映射表。
|
||||
4. 添加 `cc.Prefab` 根包装器(索引 0,`data` 指向根节点)。
|
||||
5. 更新所有 `__id__` 引用为新索引。
|
||||
6. 修复根节点 `_parent` 为 `null`。
|
||||
7. 清空所有节点的 `_id` 为空字符串。
|
||||
8. 为每个 `cc.Node` 生成 `cc.PrefabInfo`(含唯一 `fileId`、`root` 指向根节点、`asset` 指向 `cc.Prefab`)。
|
||||
9. 序列化为 JSON 字符串返回。
|
||||
- **验证**: 创建的预制体文件结构与编辑器原生拖拽创建的预制体完全一致,可正常打开编辑、实例化使用,控制台零报错。
|
||||
|
||||
ps: 感谢 @亮仔😂 😁 🐔否? 提供的反馈以及操作日志
|
||||
|
||||
14
docs/注意事项.md
14
docs/注意事项.md
@@ -11,12 +11,14 @@
|
||||
### 1.2 预制体的正确创建流程
|
||||
|
||||
- **推荐工具**:使用 `prefab_management` 的 `create` 操作,或 `create_prefab` 工具。
|
||||
- **核心逻辑**:该工具会同步处理节点的序列化、db 路径映射以及资源刷新(Refresh),确保预制体及其配套的 `.meta` 文件原子化生成。
|
||||
- **⚠️ IPC 签名要点**:底层使用的 `scene:create-prefab` 消息有严格的参数格式要求:
|
||||
1. 必须使用 `Editor.Ipc.sendToPanel("scene", ...)` 而非 `sendToMain`(该消息由 Scene 面板渲染进程处理)。
|
||||
2. 节点 ID 必须包裹在**数组**中:`[nodeId]`。
|
||||
3. 第二个参数必须是 **db:// 目录路径**(如 `db://assets`),而非完整文件路径。
|
||||
4. 预制体文件名取决于节点名称,因此创建前需先通过 `scene:set-property` 重命名节点。
|
||||
- **核心逻辑**:该工具已完全绕过 Cocos Creator 内置的 `scene:create-prefab` IPC(该接口存在根节点 PrefabInfo 损坏等已知 Bug),改为在场景进程中使用 `Editor.serialize(node)` 获取原始数据后,通过自定义 9 步后处理管线转换为标准预制体格式。
|
||||
- **⚠️ 序列化格式要点**:正确的预制体文件必须满足以下结构:
|
||||
1. 数组索引 0 必须是 `cc.Prefab` 包装器对象,其 `data` 字段指向根节点。
|
||||
2. 根节点的 `_parent` 必须为 `null`(不能指向 `cc.Scene`)。
|
||||
3. 每个 `cc.Node` 必须有 `_prefab` 引用指向对应的 `cc.PrefabInfo` 对象。
|
||||
4. 每个 `cc.PrefabInfo` 必须包含 `root`(指向根节点)、`asset`(指向索引 0 的 `cc.Prefab`)和唯一的 `fileId`。
|
||||
5. 所有节点和组件的 `_id` 字段必须为空字符串(运行时由引擎分配)。
|
||||
6. 文件中不能包含 `cc.Scene` 对象。
|
||||
|
||||
---
|
||||
|
||||
|
||||
Reference in New Issue
Block a user