AI使用 cocos cli 访问场景里的模型材质,返回的是null

编辑器版本:cocos creator 3.8.8
cocos-cli: main分支 版本:c7050863303ba20497169a64c3e08a1ab813ac42
AI用的是deepseek harness

日志如下:

@Client/assets/prefabs/HighlandArena.prefab  用cocos cli mcp 访问, 看看Wall_N是不是有材质

**结论:有材质。** `Wall_N` 上挂的是 `glass-wall.mtl`(uuid `2c95d3d2-149d-4d40-9387-c6333592420c`)。

## 证据

**1) MCP 查到的资源本身**(`assets-query-asset-info`)

| 项 | 值 |
|---|---|
| name | `glass-wall.mtl` |
| source | `db://assets/resources/Materials/glass-wall.mtl` |
| type | `cc.Material` |
| uuid | `2c95d3d2-149d-4d40-9387-c6333592420c` |

**2) prefab 作者数据**:`HighlandArena/Wall/Wall_N` 节点(`_id__: 16`)有三个组件 —— 自定义碰撞体(`3c4d55…`,shape/type/hx/hy/hz 那一坨)、描边可视化组件(`5e6f7C…`,color 90/200/255)、`cc.MeshRenderer`(`Capsule<ModelComponent>`,mesh `1263d74c-8167-4928-91a6-4e2672411f47@2e76e`)。该 MeshRenderer 的 `_materials` 指向上面那个 uuid,见 [HighlandArena.prefab:541-546](Client/assets/prefabs/HighlandArena.prefab#L541-L546)。

顺带确认:`2c95d3d2-…` 在文件里出现 **5 次**(第 543/705/893/1081/1269 行),即 N/S/E/W/T 五面墙用的是同一个 `glass-wall` 材质。

## 一个必须提醒的读数陷阱

这次我用 MCP `scene-query-component` 查 `HighlandArena/Wall/Wall_N/cc.MeshRenderer`,它返回的 `_materials` / `sharedMaterials` 里 **uuid 是空字符串**,而且返回的 path 是 `HighlandArena/Wall/Wall_N/cc.MeshRenderer_003`(多了 `_003` 后缀)。这与我们之前踩过的坑完全一致:**该工具对 `MeshRenderer._materials` 的读数不可信(实测返回空、磁盘上非空)**。如果你只看 MCP 那一条返回,会误判成「Wall_N 没材质 / 材质被清空」——实际上材质完好,prefab 文本和 `assets-query-asset-info` 都能对上。

所以:**结论以 prefab 文本 + 资产库查询为准**;MCP 这条 `_materials` 空值不能作为判据。

本次只做了只读查询(`scene-query-current` / `scene-query-node` / `scene-query-component` / `assets-query-*`),没有 `scene-save`、没有改任何文件。

我之前给AI定了规则,只允许使用cocos-cli修改预制体, 然后就把我材质都搞没了,用文本方式去编辑prefab,反而不会出问题

(帖子被作者删除,如无标记将在 24 小时后自动删除)

解决了, 是AI太蠢, 如果没有修改内容只是open,这时候不会触发close,用户手动去编辑器了改了材质后,再让AI改时,他访问mcp用的的缓存还是上一次的, 就导致被覆盖。

给skill加一个记忆,每次用完cli的open都得close就行了, 重新open就会加载到用户的改动了。

cocos-cli\dist\api\scene\scene.js 84行改成
const data = await scene_1.Scene.close({ save: false });

这样可以避免AI只是查看数据也会额外保存一次数据的问题