C# SerializationException:类型UnityEngine.GameObject未标记为可序列化

C# SerializationException:类型UnityEngine.GameObject未标记为可序列化,c#,unity3d,save,unityscript,C#,Unity3d,Save,Unityscript,我想问点事。我正在制作一个游戏,我试图像收割月亮一样保存和加载游戏的数据,但是我得到了这个错误。我在谷歌搜索过这种错误,但我不知道如何解决它。这是我的密码 using UnityEngine; using System.Collections; using System; using System.Collections.Generic; using System.Runtime.Serialization.Formatters.Binary; using System.IO; public

我想问点事。我正在制作一个游戏,我试图像收割月亮一样保存和加载游戏的数据,但是我得到了这个错误。我在谷歌搜索过这种错误,但我不知道如何解决它。这是我的密码

using UnityEngine;
using System.Collections;
using System;
using System.Collections.Generic;
using System.Runtime.Serialization.Formatters.Binary; 
using System.IO;

public class gameController : MonoBehaviour {
    public static gameController control;
    public basicskill bs;

    // Use this for initialization
    void Awake () {
        if(control == null)
        {
            DontDestroyOnLoad(gameObject);
            control = this;
        }
        else if(control != this)
        {
            Destroy(gameObject);
        }

    }

    void OnGUI(){
        GUI.Label (new Rect (10, 10, 100, 30), "Health: " + bs.charPrince.health);
        GUI.Label (new Rect (10, 40, 140, 30), "Experience: " + bs.charPrince.exp);
    }

    public void Save(){

        BinaryFormatter bf = new BinaryFormatter ();
        FileStream file = File.Create (Application.persistentDataPath + "/playerInfo.dat");

        Prince data = new Prince ();
        data.name = bs.charPrince.name;
        data.birthday = bs.charPrince.birthday;
        data.hadapAtas = bs.charPrince.hadapAtas;
        data.hadapKanan = bs.charPrince.hadapKanan;
        data.locationY = bs.charPrince.locationY;
        data.locationX = bs.charPrince.locationX;
        data.exp = bs.charPrince.exp;
        data.health = bs.charPrince.health;
        bf.Serialize (file, data);
        file.Close ();
    }

    public void Load(){
        if(File.Exists(Application.persistentDataPath + "/playerInfo.dat"))
        {
            BinaryFormatter bf = new BinaryFormatter();
            FileStream file = File.Open(Application.persistentDataPath + "/playerInfo.dat", FileMode.Open);
            Prince data = (Prince)bf.Deserialize(file);
            file.Close();

            bs.charPrince.name = data.name;
            bs.charPrince.birthday = data.birthday ;
            bs.charPrince.hadapAtas = data.hadapAtas ;
            bs.charPrince.hadapKanan = data.hadapKanan;
            bs.charPrince.locationY = data.locationY;
            bs.charPrince.locationX = data.locationX;
            bs.charPrince.exp = data.exp;
            bs.charPrince.health = data.health;
        }
    }

    // Update is called once per frame
    void Update () {

    }
}
从上面的代码中,我得到了一个错误

序列化异常:类型UnityEngine.GameObject未标记为 可序列化。 System.Runtime.Serialization.Formatters.Binary.BinaryCommon.CheckSerializable (System.Type类型、ISurrogateSelector选择器、StreamingContext (上下文)(在 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/binarycomon.cs:119) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteValue (System.IO.BinaryWriter编写器,System.Type值类型,System.Object val)(在 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/ObjectWriter.cs:732) Prince__TypeMetadata.WriteObject数据 (System.Runtime.Serialization.Formatters.Binary.ObjectWriter, System.IO.BinaryWriter,System.Object) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObject (System.IO.BinaryWriter编写器,Int64 id,System.Object obj)(位于 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/ObjectWriter.cs:360) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectInstance (System.IO.BinaryWriter编写器,System.Object对象,布尔值 isValueObject)(在 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/ObjectWriter.cs:293) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteQueueObjects (System.IO.BinaryWriter)(位于 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/ObjectWriter.cs:271) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectGraph (System.IO.BinaryWriter编写器,System.Object对象, System.Runtime.Remoting.Messaging.Header[]headers)(位于 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/ObjectWriter.cs:256) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serializate (System.IO.Stream序列化流、System.Object图、, System.Runtime.Remoting.Messaging.Header[]headers)(位于 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:232) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serializate (System.IO.Stream序列化流,System.Object图)(位于 /Users/builduser/buildslave/mono运行时和classlibs/build/mcs/class/corlib/System.runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:211) gameController.Save()(位于Assets/Scripts/gameController.cs:45) adjustScript.OnGUI()(位于Assets/Scripts/adjustScript.cs:32)

这是我的其他密码

using UnityEngine;
using System.Collections;
using System;

public class adjustScript : MonoBehaviour {
    void OnGUI(){
        if(GUI.Button(new Rect(10,100,100,30),"Health Up"))
        {
            gameController.control.bs.charPrince.health += 10;
        }
        if(GUI.Button(new Rect(10,140,100,30),"Health Down"))
        {
            if(gameController.control.bs.charPrince.health >0)
            {
                gameController.control.bs.charPrince.health -= 10;
            }
        }
        if(GUI.Button(new Rect(10,180,100,30),"Experience Up"))
        {
            gameController.control.bs.charPrince.exp += 10;

        }
        if(GUI.Button(new Rect(10,220,100,30),"Experience Down"))
        {
            if(gameController.control.bs.charPrince.exp >0)
            {
                gameController.control.bs.charPrince.exp -= 10;
            }
        }
        if(GUI.Button(new Rect(10,260,100,30),"Save"))
        {
            gameController.control.Save();

        }
        if(GUI.Button(new Rect(10,300,100,30),"Load"))
        {
            gameController.control.Load();

        }
    }
}



using UnityEngine;
using System.Collections;
using System.Collections.Generic;
using System;

[Serializable]
public class Prince : Character{
    public float health = 100f;
    public float exp = 0f;
    public float kecMaks = 0f;
    public float moveV = 0f;
    public float moveH = 0f;
    public bool hadapKanan = false;
    public bool hadapAtas = true;
    public GameObject objPrince;

    public Prince()
    {
        this.name = "";
        this.birthday = "";
        this.objPrince = null;
    }
    public Prince(GameObject objChar,string nama, string birthday){
        this.name = nama;
        this.birthday = birthday;
        this.objPrince = objChar;
    }
}


using UnityEngine;
using System.Collections;
using System;

[Serializable]
public class Character  {
    public string name;
    public string birthday;
    public float locationX;
    public float locationY;

    public Character(){
        this.name = "";
        this.birthday = "";
        this.locationX = 0f;
        this.locationY = 0f;
    }
}

请帮我解决这个问题。我从unity的关于持久性保存和加载数据的实时教程中学到了这一点,但是编写这种代码的人没有这个错误

我也犯了同样的错误。。。 我发现这是一个解决方案: (就你而言)

这意味着您不能保存(序列化)objPrince,但您可以在运行时拥有一个实时引用。为了获得objPrince所需的预置,我每次实例化时都通过“namePrince”从参考资料中加载它

此外,几乎没有理由保存游戏对象,除非玩家可以在游戏时间或类似的时间编辑游戏对象。即使这样,您仍然可以从使用过的“身体部位”或其他地方保存名称,并在需要时从Resources文件夹加载


希望这仍然有帮助。

错误消息描述了问题所在。你能将游戏对象标记为可序列化吗?教程真的提供了Prince类必须具有GameObject属性吗?
这是您对
Prince
当前实例的引用-您不需要
GameObject对象属性
,是吗?
Prince
类被标记为
[Serializable]
,但它无法序列化
游戏对象
,因此您需要将其删除或删除
[System.NonSerialized]
private GameObject objPrince;

public GameObject ObjPrince{get{return objPrince;}set{objPrince = value;}}