Serialization 关闭Unity时,序列化行为不当

Serialization 关闭Unity时,序列化行为不当,serialization,unity3d,Serialization,Unity3d,我正在使用ISerializationCallbackReceiver来序列化我的自定义相关数据,这是关于图形节点序列化的教程,它可以根据我的需要进行调整 当我在开发脚本时热交换代码时,我的序列化工作正常。但是,一旦我保存了场景,关闭Unity并再次重新加载项目,我的数据就会从一些伪数据中反序列化 [01] [17:23:43] Quest[The Sculpture and The Box|SLEEP]: Serializing QuestStepData[fqcn=experiment.qu

我正在使用ISerializationCallbackReceiver来序列化我的自定义相关数据,这是关于图形节点序列化的教程,它可以根据我的需要进行调整

当我在开发脚本时热交换代码时,我的序列化工作正常。但是,一旦我保存了场景,关闭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行“描述”与第01行不同,与第02行相比,第04行除了“fqcn”字段之外缺少所有内容

日志尽可能精确(我正在将它们写入文件),因此Unity在关闭时对我的数据所做的最后一件事应该是这些序列化行01和02

现在我被磨光了

  • 在热交换代码时,序列化可以完美地工作
  • 重新启动Unity时不工作。。。(最糟糕的是它只“删除”了一些信息)
  • 有没有提示我可能做错了什么

    (3个以上的项目也是如此……只有第1个项目是正确的)

    注意:将资产序列化设置为“混合”或“强制文本”并不重要

    如果“混合”,则场景文件中的数据如下所示:

    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]

    如果我有“强制文本”,则场景文件中的数据如下所示(实际上更糟):

    嗯,那里发生了什么事?

    Aaaa

    诀窍是每次更改时调用EditorUtility.SetDirty(gameObject),如本页所述:

    Unity在内部使用脏标志查找资产发生更改时的,以及需要保存到磁盘时的

    例如,如果修改预置的MonoBehavior或ScriptableObject变量,则必须告诉Unity该值已更改。每当属性更改时,Unity内置组件在内部调用SetDirtyMonoBehaviorScriptableObject不会自动执行此操作,因此如果希望保存值,则需要调用SetDirty

    因此,无论何时创建CustomEditor,请确保使用以下技巧:

    GUI.changed = false;
    
    // do you're edit code here
    
    if (GUI.changed) SetDirty(yourGameObjectThatHasJustChanged);
    
    希望这能节省别人的时间:-)

    干杯

    Aaaa

    诀窍是每次更改时调用EditorUtility.SetDirty(gameObject),如本页所述:

    Unity在内部使用脏标志查找资产发生更改时的,以及需要保存到磁盘时的

    例如,如果修改预置的MonoBehavior或ScriptableObject变量,则必须告诉Unity该值已更改。每当属性更改时,Unity内置组件在内部调用SetDirtyMonoBehaviorScriptableObject不会自动执行此操作,因此如果希望保存值,则需要调用SetDirty

    因此,无论何时创建CustomEditor,请确保使用以下技巧:

    GUI.changed = false;
    
    // do you're edit code here
    
    if (GUI.changed) SetDirty(yourGameObjectThatHasJustChanged);
    
    希望这能节省别人的时间:-)

    干杯