【问题标题】:Serialize & Deserialize Unity3D MonoBehaviour script序列化和反序列化 Unity3D MonoBehaviour 脚本
【发布时间】:2019-05-23 13:43:17
【问题描述】:

背景:继承自 Monobehaviour 的类无法序列化。

前提:一种保存 MonoBehaviour 脚本的数据(变量/字段及其值)的方法,以便可以对其进行序列化,然后再次对其进行反序列化,并使用此数据“填充”相应的 MonoBehaviour 脚本的变量/字段值.

到目前为止尝试过:

  1. 拥有一个可序列化的“包装器/容器”类,该类具有与 MB 脚本相同的字段,但不从 MB 继承。效果很好,但每个 MV 脚本都需要它自己的包装类和它自己的包装函数。
  2. 序列化 List<FieldInfo> 并用 MB 的字段填充它... 工作 30%;
    • FieldInfos 已添加但类型错误,并且
    • 反序列化时无法访问它们的值,因为需要类的实例,但只有一个列表可用

我觉得这不会那么难,但我的反思技能和相关技能是有限的,但看到保存/加载是一个相当普遍的功能,我希望有人做到了,或者有人可以指出我的正确方向方向。

【问题讨论】:

    标签: serialization unity3d


    【解决方案1】:

    使用 .NET 中内置的 BinaryFormatter 序列化 MonoBehaviour 并不容易。您可以考虑以下几个选项:

    1. 使用Memento Patter。这(或多或少)是您尝试使用包装器实现的目标。 Momento 假设保存和恢复对象的内部状态,因此序列化是一种技术。
    2. 使用 Unity 序列化,通过声明方法:

      void Serialize(){}

      void 反序列化(){}

      在您的 MonoBehaviour 脚本中,因此您将在方法中选择要序列化/反序列化的属性/字段。

    3. 有一个有趣的框架,源代码在GitHub。它有一个自定义的序列化框架,可以让你序列化几乎任何东西(不仅仅是单一行为)。没用过,Unity3d论坛here is the forum page,相信值得一看。

    【讨论】:

    • 感谢您的回答。我确实看过一些自定义框架,但我希望避免使用一个,因为它们往往对我的需求影响太大,因此如果我需要进行更改,很难进行逆向工程:) 他们的想法是加载和保存gameObject 当保存/加载保存的游戏时,我拥有我需要的所有东西,例如实例化正确的预制件,跟踪孩子等等,但是到目前为止,我还没有从组件中保存和加载数据:(我想我会必须回到使用包装器,至少它提供了最大的控制。当然欢迎任何其他想法!:)
    • 更新:获得了一种很有前途的新做事方式。我从 UnitySerializer 资产中复制了这个方法。我仍然有一个通用的包装类来存储游戏对象的数据;它具有 Transform 变量的值,以及它的 id 和它的父级(如果有)。至于 MB 脚本组件,该类有一个 Dictionary,其中字符串保存字段的名称,对象保存字段的值。
    • 然后,只需遍历游戏对象的组件字段并将它们添加到字典中,然后在反序列化时,遍历反序列化字典的 KeyValuePairs 并使用字符串(名称)获取字段,并使用对应的字典设置对应的值。
    • 太棒了!如果它不是太大,请分享您的代码,因为它对寻求相同问题的其他用户有很大帮助
    • 是的,我计划在经过全面测试后在此处添加答案。昨天我只是用一个带有 int 类型变量的简短脚本快速测试了它,今天我想扩展它以查看它是否适用于 Unity 特定的变量,或者是否需要变通方法。
    【解决方案2】:

    问题的答案是:ScriptableObject。这就是他们的目的。

    将您的变量放入 ScriptableObject 中,Unity 将处理序列化并为您提供自定义编辑器和其他不错的功能。推荐。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-17
      • 2013-04-19
      • 2018-12-05
      • 2013-01-08
      • 2015-03-17
      相关资源
      最近更新 更多