包含ScriptableObject的Unity字段未序列化

时间:2016-03-13 13:12:28

标签: c# serialization unity3d

我在让字段正确序列化方面遇到了问题。

它链接到扩展ScriptableObject的自定义类型。自定义编辑器正在创建此对象的实例,并且它未被保存为资产文件。我现在理解你可以做到这一点 - Unity应该将这些数据自动保存到场景中而不是项目中。

首先,MonoBehaviour类。这个我设置为持有Bar和一个字符串的实例,只是为了仔细检查序列化是否正常工作。我使用具有暴露属性的字段,所以我已经在这里完成了它,并且我知道涉及反射。

public class Foo : MonoBehaviour
{
    [SerializeField]
    private Bar bar;

    [SerializeField]
    private string check;

    public Bar Bar { get { return this.bar; } set { this.bar = value; } }
}

接下来,基于ScriptableObject的{​​{1}}课程。这是我要实例化和链接的类,但不保存为资产文件。

Bar

最后,[Serializable] public class Bar : ScriptableObject { [SerializeField] private string data; } 允许我创建和链接CustomEditor的实例:

Bar

在跑步之前,输入数据并按下按钮:

Before Running

在跑步期间:

enter image description here

跑完后:

enter image description here

字符串序列化正确。

但是,[CustomEditor(typeof(Foo))] public class StreamableResourceTestEditor : Editor { public override void OnInspectorGUI() { base.OnInspectorGUI(); if (GUILayout.Button("Link unsaved Bar asset")) { Bar bar = ScriptableObject.CreateInstance<Bar>(); bar.name = "Unsaved asset"; Foo foo = (Foo)this.target; foo.Bar = bar; EditorUtility.SetDirty(foo); } } } 无法序列化为运行时数据。不仅如此,在运行项目后,实例仍然是链接的,但已丢失了它的类型!

有谁知道这个问题是什么?

更新

刚刚对ScriptableObject的{​​{1}}进行了扩展测试,并将其设置为普通的C#实例,而不是Bar,并且它都按预期工作。

无论问题是什么,它都与从ScriptableObject扩展有关。

0 个答案:

没有答案