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

Serialize & Deserialize Unity3D MonoBehaviour script

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

前提:一种保存 MonoBehaviour 脚本的数据(variables/fields 及其值)的方法,因此可以对其进行序列化,并再次反序列化并将此数据用于 "fill in" 相应的 MonoBehaviour脚本的 variable/field 值。

到目前为止尝试过:

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

我觉得这不会那么难,但我的反思技巧和相关知识有限,但看到 saving/loading 是一个相当普遍的特征,我希望有人做到了或者有人可以指出我的方向是正确的。

没有简单的方法可以使用 .NET 中内置的 BinaryFormatter 序列化 MonoBehaviour。您可以考虑以下几种选择:

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

    void Serialize(){}

    void Deserialize(){}

    在您的 MonoBehaviour 脚本中,因此在方法中您将选择您想要 serialize/deserialize 的 properties/fields。

  3. Unity3d论坛上有一个有趣的框架,源码在GitHub. It has a custom serialization framework that lets you serialize almost anything (not only monobehaviors). I have never used it, here is the forum page,相信值得一看。

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

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