我正在使用ISerializationCallbackReceiver按照教程http://blogs.unity3d.com/2014/06/24/serialization-in-unity/序列化我的自定义相关数据,关于图形节点的序列化,根据我的需要进行调整。
当我在开发脚本时热插拔代码时,我的序列化工作正常。但是一旦我保存了场景,关闭Unity并再次重新加载项目,我的数据就会从一些虚假中反序列化。
[01] [17:23:43] Quest[The Sculpture and The Box|SLEEP]: Serializing QuestStepData[fqcn=experiment.questsjg.steps.GoToLocation|name=Sculpture|description=F|closedByIndex=-1|go1Present=True|go1=sculptures_01_02 (UnityEngine.GameObject)|go2Present=True|go2=[1] Go To Location Point (Sculpture) (UnityEngine.GameObject)|f1=8]
[02] [17:23:43] Quest[The Sculpture and The Box|SLEEP]: Serializing QuestStepData[fqcn=experiment.questsjg.steps.GoToLocation|name=box|description=S|closedByIndex=-1|go1Present=True|go1=box1 (UnityEngine.GameObject)|go2Present=True|go2=[2] Go To Location Point (box) (UnityEngine.GameObject)|f1=4]
[03] [17:24:09] Quest[The Sculpture and The Box|SLEEP]: Deserializing QuestStepData[fqcn=experiment.questsjg.steps.GoToLocation|name=Sculpture|description=|closedByIndex=-1|go1Present=True|go1= (UnityEngine.GameObject)|go2Present=True|go2= (UnityEngine.GameObject)|f1=8]
[04] [17:24:09] Quest[The Sculpture and The Box|SLEEP]: Deserializing QuestStepData[fqcn=experiment.questsjg.steps.GoToLocation|name=|description=|closedByIndex=-1|go1Present=False|go2Present=False|f1=10]
这是我正在/序列化的日志。 Unity在17:23:45-17:24:00之间重新启动,你可以看到它没有从我序列化的相同数据(第01和02行)中反序列化(第03和04行)。
当我保存场景时,我通常会记录第01和02行。
但是当这些"行"当我打开Unity时得到反序列化,我得到第03和第04行,你可以看到第03行和#34;描述"与第01行不同,第04行缺少除了' fqcn'与第02行比较时的字段。
日志尽可能准确(我将它们写入文件),因此这些序列化行01和02应该是Unity在关闭时对数据做的最后一件事......
现在我已经爱了......
任何提示我可能做错了什么?
(对于3件以上的物品也是如此......只有第1件物品在某种程度上是正确的)
P.S。:将资产序列化设置为"混合"无关紧要。或"强制文字"。
如果我有" MIXED"那么场景文件中的数据如下所示:
The Sculpture and The Box ! NyŻ
stepsData.Array.data[0].fqcn&
experiment.questsjg.steps.GoToLocation ! NyŻ %
stepsData.Array.data[0].closedByIndex -1 ! NyŻ
stepsData.Array.data[0].f1 8 ! NyŻ
stepsData.Array.data[0].name Sculpture ! NyŻ
stepsData.Array.data[0].go1 ^ ! NyŻ "
stepsData.Array.data[0].go1Present 1 ! NyŻ
stepsData.Array.data[0].go2 *¨ ! NyŻ "
stepsData.Array.data[0].go2Present 1 ! NyŻ
stepsData.Array.data[1].fqcn&
experiment.questsjg.steps.GoToLocation ! NyŻ %
stepsData.Array.data[1].closedByIndex -1 ! NyŻ
stepsData.Array.data[1].f1 10 ! NyŻ
如您所见,序列化数据不存在,只需比较stepsData.Array.data [0]和stepsData.Array.data [1]
如果我有"强制文字"然后场景文件中的数据看起来像这样(实际上甚至更糟):
- target: {fileID: 11499854, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: stepsData.Array.data[0].fqcn
value: quests.steps.GoToLocation
objectReference: {fileID: 0}
- target: {fileID: 11499854, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: stepsData.Array.data[0].closedByIndex
value: -1
objectReference: {fileID: 0}
- target: {fileID: 11499854, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: stepsData.Array.data[0].f1
value: 10
objectReference: {fileID: 0}
- target: {fileID: 11499854, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: stepsData.Array.data[1].fqcn
value: quests.steps.GoToLocation
objectReference: {fileID: 0}
- target: {fileID: 11499854, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: stepsData.Array.data[1].closedByIndex
value: -1
objectReference: {fileID: 0}
- target: {fileID: 11499854, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: stepsData.Array.data[1].f1
value: 10
objectReference: {fileID: 0}
- target: {fileID: 107138, guid: bd017908bdedeb24d9559a160e99a0c1, type: 2}
propertyPath: m_Name
value: First Quest
objectReference: {fileID: 0}
嗯,那里发生了什么?
答案 0 :(得分:0)
AAAA级!
诀窍是调用 EditorUtility.SetDirty(gameObject) 每次更改,因为此页面指出:http://docs.unity3d.com/ScriptReference/EditorUtility.SetDirty.html
当资产发生变化且需要保存到磁盘时,Unity内部使用脏标志 查找。
E.g。如果修改预制的MonoBehaviour或ScriptableObject变量,则必须告诉Unity该值已更改。只要属性发生更改,Unity内置组件就会在内部调用SetDirty。 MonoBehaviour 或 ScriptableObject不要 自动所以如果您希望保存您的值,则需要调用SetDirty。
因此,只要您在http://docs.unity3d.com/Manual/editor-CustomEditors.html之后创建自定义编辑器,请确保使用该技巧:
GUI.changed = false;
// do you're edit code here
if (GUI.changed) SetDirty(yourGameObjectThatHasJustChanged);
希望这可以节省某人的时间: - )
干杯!