C# 包含未序列化ScriptableObject的Unity字段
我在获取要正确序列化的字段时遇到问题 它链接到一个自定义类型,该类型扩展了C# 包含未序列化ScriptableObject的Unity字段,c#,serialization,unity3d,C#,Serialization,Unity3d,我在获取要正确序列化的字段时遇到问题 它链接到一个自定义类型,该类型扩展了ScriptableObject。自定义编辑器正在创建此对象的实例,但未将其保存为资源文件。据我目前的理解,您可以这样做-Unity应该将这些数据保存到场景中,而不是自动保存到项目中 首先是monobhavior类。我设置它来保存一个Bar实例和一个字符串,只是为了再次检查序列化是否正常工作。我使用具有公开属性的字段,所以我在这里做过,我知道涉及反射 public class Foo : MonoBehaviour {
ScriptableObject
。自定义编辑器正在创建此对象的实例,但未将其保存为资源文件。据我目前的理解,您可以这样做-Unity应该将这些数据保存到场景中,而不是自动保存到项目中
首先是monobhavior
类。我设置它来保存一个Bar实例和一个字符串,只是为了再次检查序列化是否正常工作。我使用具有公开属性的字段,所以我在这里做过,我知道涉及反射
public class Foo : MonoBehaviour
{
[SerializeField]
private Bar bar;
[SerializeField]
private string check;
public Bar Bar { get { return this.bar; } set { this.bar = value; } }
}
接下来,基于Bar
类的ScriptableObject
。这是我想要实例和链接的类,但不是另存为资产文件
[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);
}
}
}
[CustomEditor(typeof(Foo))]
公共类StreamableResourceTester编辑器:编辑器
{
公共覆盖无效OnInspectorGUI()
{
base.OnInspectorGUI();
if(GUILayout.Button(“链接未保存的条形图资源”))
{
Bar=ScriptableObject.CreateInstance();
bar.name=“未保存的资产”;
Foo Foo=(Foo)this.target;
foo.Bar=Bar;
EditorUtility.SetDirty(foo);
}
}
}
运行前,输入数据并按下按钮后: 运行期间: 运行后:
字符串正确序列化 但是,
ScriptableObject
无法序列化到运行时数据中。不仅如此,在运行项目之后,实例仍然是链接的,而且已经丢失了它的类型
有人知道这有什么问题吗
更新: 只是测试了一下,没有从
ScriptableObject
扩展Bar
,而是将其创建为一个普通的C#实例,而不是使用ScriptableObject.CreateInstance
,一切正常
无论问题是什么,它都与从ScriptableObject扩展有关。不相关,但您的属性与类型命名相同。我会给它一个不同的命名,因为它可能会发生冲突。Unity序列化程序中的所有反射,当然值得一看——将它改为MyBar,尽管很遗憾,结果是一样的。