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的一种方式。因此GUID
和Type
属性并没有赋值。
在保存场景进行序列化的时候,Unity会对GUID进行检查,没有赋值的GUID
和Type
并不能通过检查。最终报错。
4. 解决方案
所以解决方案就很简单啦,不要保存SpriteAtlas.GetSprite
克隆出来的实例就可以了。