[Unity开发记录] 错误:Could not extract GUID in text file *.unity at line ???

[Unity开发记录] 错误:Could not extract GUID in text file *.unity at line ???_第1张图片

1. 问题和基础知识准备

最近项目遇到奇怪的问题,每次保存场景就会有大量的报错
项目使用了的序列化模式是Visible Meta Files + Force Text。所以可以直接查看文件来查看具体的错误来源。
既然是Unity序列化的问题,那我们可以学习一下相关的知识。
推荐Unity文件、文件引用、meta详解 - CodeGize - 博客园

2. 打开.unity文件查看信息。

--- !u!213 &390097
Sprite:
  m_ObjectHideFlags: 0
  m_CorrespondingSourceObject: {fileID: 0}
  m_PrefabInstance: {fileID: 0}
  m_PrefabAsset: {fileID: 0}
  m_Name: Power
  m_AtlasTags:
  - Ui
  m_SpriteAtlas: {fileID: 4343727234628468602, guid: 1829e7d3505a379468f2a0b1761c4729,
    type: 2}
  m_AtlasRD:
    serializedVersion: 3
    texture: {fileID: 3, guid: 00000000000000000000000000000000, type: 0}
    alphaTexture: {fileID: 0}

报错的数据为texture: {fileID: 3, guid: 00000000000000000000000000000000, type: 0}

3. 错误分析

我们通过--- !u!213 &390097中的FileID390097查找引用。

    - target: {fileID: 114597316970944168, guid: a4b3c9392426a9046b025bb56cc1ceca,
        type: 3}
      propertyPath: Icon.Array.data[3]
      value: 
      objectReference: {fileID: 390097}

发现他在一个Icon的列表当中存储着。查看代码之后发现这个列表是在编辑器生成的。而报错的Sprite是一个通过SpriteAtlas.GetSprite克隆出来的实例。m_AtlasRD我猜测是作为SpriteAtlas内部存储结构。他的fileID是运行时对应SpriteAtlas的一种方式。因此GUIDType属性并没有赋值
在保存场景进行序列化的时候,Unity会对GUID进行检查,没有赋值的GUIDType并不能通过检查。最终报错。

4. 解决方案

所以解决方案就很简单啦,不要保存SpriteAtlas.GetSprite克隆出来的实例就可以了。

你可能感兴趣的:(Unity)