我在让字段正确序列化方面遇到了问题。
它链接到扩展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
在跑步之前,输入数据并按下按钮:
在跑步期间:
跑完后:
字符串序列化正确。
但是,[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扩展有关。