Unity 报错 Duplicate identifier 2100000:一次“材质 .mat 合并残留”定位与最小修复

Unity 报错 Duplicate identifier 2100000:一次“材质 .mat 合并残留”定位与最小修复

适用场景:Unity 导入/刷新资源时,Console 报 Duplicate identifier xxxx,并指出某个 .mat/.prefab/.asset 等 YAML 文本资源“存在多个相同 identifiers”,导致文件加载失败。


现象:Unity 无法加载材质文件

我遇到的报错核心信息如下(关键两行足够定位方向):

  • Duplicate identifier 2100000. File: "Assets/Temp/Materials/Level01_LayoutRef.mat".
  • Error loading the file ... File has multiple objects with same identifiers. Probably caused by a merge.

影响是:该 .mat 在导入阶段就被 Unity 拒绝解析,Console 持续报错,后续可能引发材质引用丢失(取决于场景/预制体是否引用它)。


根因:同一个 .mat 文件里出现了“重复的 YAML 文档块”

Unity 的很多资源在启用文本序列化时,本质是 YAML 文本。正常情况下,一个 .mat 文件里应该只有一个 Material 对象块,例如:

%YAML 1.1
%TAG !u! tag:unity3d.com,2011:
--- !u!21 &2100000
Material:
  ...

这次问题的根因是:同一个 Assets/Temp/Materials/Level01_LayoutRef.mat 文件里出现了 两段 YAML 文档块,而且两段都写了同样的对象锚点:

  • --- !u!21 &2100000

于是 Unity 发现“同文件内出现多个对象但 identifiers(这里是 2100000)重复”,直接拒绝加载。

这种情况很像:合并冲突残留/手工拼接 导致同一份资源被重复粘贴进文件里。


最小修复:删除第二段重复文档(从第二个 %YAML 1.1 开始)

修复思路很简单:让文件里只剩 一个 Material 对象定义。

步骤

  1. 用文本编辑器打开:Assets/Temp/Materials/Level01_LayoutRef.mat
  2. 搜索 %YAML 1.1
  3. 如果你能找到 第二个 %YAML 1.1,那么从它开始到文件末尾,通常就是重复粘贴出来的第二段文档
  4. 删除这段重复内容,保存文件

为什么说这是“最小修复”

  • 不改 GUID、不改 fileID、不改材质属性结构,只是移除重复的第二份对象定义
  • 风险最低,且与 Unity 报错描述(Probably caused by a merge)一致

如何验证修复成功

回到 Unity 后,验证路径如下:

  • 等待资源重新导入完成,确认 Console 不再出现:
    • Duplicate identifier 2100000
    • multiple objects with same identifiers

如果你改完文件但 Console 仍显示旧报错,通常是导入队列/缓存未刷新,可以尝试:

  • 在 Project 视图中对 Assets 执行 Reimport All
  • 或直接重启 Unity

下次怎么避免(防止同类问题再发生)

  • 不要手工拼接 .mat/.prefab/.asset 等 Unity YAML 文本资源
  • 如果使用版本控制,发生冲突时建议:
    • 优先用 Unity 推荐的 YAML 合并工具(UnityYAMLMerge / Smart Merge)
    • 并尽量保持 Unity 资源为文本序列化,便于审查差异与合并

附:本次修复涉及文件

  • Assets/Temp/Materials/Level01_LayoutRef.mat
posted @ 2026-01-23 11:08  星空探险家  阅读(11)  评论(0)    收藏  举报