序列化&反序列化Unity3D MonoBehaviour脚本

时间:2015-04-18 16:26:04

标签: serialization unity3d

背景:从Monobehaviour继承的类不能被序列化。

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

到目前为止尝试过:

  1. 拥有可序列化的"包装/容器"与MB脚本具有相同字段但不从MB继承的类。很好地工作,但每个MV脚本都需要它自己的包装类和它自己的包装功能。
  2. 序列化List<FieldInfo>并将其填入MB的字段...工作30%;
    • FieldInfos已添加,但类型错误,
    • 当反序列化时,无法访问它们的值,因为需要一个类的实例,但只有一个列表可用
  3. 我觉得它可以变得那么难,但我的反思技巧和相关性有限,但看到保存/加载是一个相当常见的功能我希望有人做过它或有人可以指出我正确的方向。

2 个答案:

答案 0 :(得分:2)

没有简单的方法可以使用.NET内置的BinaryFormatter来序列化MonoBehaviour。您可以考虑几个选项:

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

    void Serialize(){}

    void Deserialize(){}

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

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

答案 1 :(得分:0)

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

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