关闭Unity时序列化行为不端

时间:2015-06-18 15:51:28

标签: serialization unity3d

我正在使用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在关闭时对数据做的最后一件事......

现在我已经爱了......

  1. 热插拔代码时序列化正在顺利运行
  2. 重启Unity时不起作用......(最糟糕的是它"掉线"只有一些信息)
  3. 任何提示我可能做错了什么?

    (对于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}
    
    嗯,那里发生了什么?

1 个答案:

答案 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);

希望这可以节省某人的时间: - )

干杯!