Serialization 关闭Unity时,序列化行为不当
我正在使用ISerializationCallbackReceiver来序列化我的自定义相关数据,这是关于图形节点序列化的教程,它可以根据我的需要进行调整 当我在开发脚本时热交换代码时,我的序列化工作正常。但是,一旦我保存了场景,关闭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
[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
现在我被磨光了
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内置组件在内部调用SetDirtyMonoBehavior或ScriptableObject不会自动执行此操作,因此如果希望保存值,则需要调用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内置组件在内部调用SetDirtyMonoBehavior或ScriptableObject不会自动执行此操作,因此如果希望保存值,则需要调用SetDirty
因此,无论何时创建CustomEditor,请确保使用以下技巧:
GUI.changed = false;
// do you're edit code here
if (GUI.changed) SetDirty(yourGameObjectThatHasJustChanged);
希望这能节省别人的时间:-)
干杯