Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 包含未序列化ScriptableObject的Unity字段_C#_Serialization_Unity3d - Fatal编程技术网

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,尽管很遗憾,结果是一样的。