2014-10-08 85 views
0

我想问一些问题。我正在制作一款游戏,并且我正在尝试保存和加载游戏的数据,就像收获月亮一样,但是我得到了这个错误。我在谷歌搜索了这种错误,但我不知道如何解决它。这是我的代码。SerializationException:类型UnityEngine.GameObject未标记为可序列化

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() { 

    } 
} 

从上面代码中,我得到了错误

SerializationException:类型UnityEngine.GameObject没有标记为 Serializable接口。 System.Runtime.Serialization.Formatters.Binary.BinaryCommon.CheckSerializable (System.Type的类型,ISurrogateSelector选择器,的StreamingContext 上下文)(在 /用户/ builduser/buildslave /单运行时和 - classlibs /建造/ MCS/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryCommon.cs:119) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteValue (System.IO.BinaryWriter writer,System.Type valueType,System。 Object val)(在 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:732) Prince__TypeMetadata.WriteObjectData (System.Runtime.Serialization.Formatters.Binar y.ObjectWriter, System.IO.BinaryWriter,System.Object的) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObject (System.IO.BinaryWriter作家,Int64类型ID,System.Object的OBJ)(在 /用户/ builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:360) System.Runtime.Serialization.Formatters.Binary.ObjectWriter .WriteObjectInstance (System.IO.BinaryWriter writer,System.Object obj,Boolean isValueObject)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime。 Serialization.Formatters.Binary/ObjectWriter.cs:293) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteQu euedObjects (System.IO.BinaryWriter writer)(位于 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs: 271) System.Runtime.Serialization.Formatters.Binary.ObjectWriter.WriteObjectGraph (System.IO.BinaryWriter writer,System.Object obj, System.Runtime.Remoting.Messaging.Header [] headers)(在 /Users /建立/ buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/ObjectWriter.cs:256) System.Runtime.Serialization.Formatters.Binary.BinaryFormatter.Serialize (System.IO.Stream serializationStream,System.Object graph, System.Runtime.Remoting.Messaging.Header [] headers)(at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization.Formatters.Binary/BinaryFormatter.cs:232) System.Runtime.Serialization.Formatters.Binary .BinaryFormatter.Serialize (System.IO.Stream serializationStream,System.Object图)(位于 /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Runtime.Serialization。 (在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; 
    } 
} 

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

+1

错误消息描述了什么是错的。你能将GameObject标记为Serializable吗?教程是否真的提供了Prince类必须具有GameObject属性? – Reniuz 2014-10-08 05:29:12

+0

'this'是你引用当前的'Prince'实例 - 你不需要'GameObject objPrince'吗? 'Prince'类标记为[[Serializable]],但不能序列化'GameObject',因此您需要将其删除或[使其可序列化](http://blogs.unity3d.com/2014/06/ 24 /串行化功能于统一/) – 2014-10-08 08:32:24

回答

0

我郁闷到了同样的错误...... 发现这对我来说是解决方案: (你的情况)

[System.NonSerialized] 
private GameObject objPrince; 

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

这并不意味着你不能保存(序列化)的objPrince,但您可以在运行时拥有实时参考。为了得到所需的objPrince预制件,我每次实例化时都会通过“namePrince”从资源中加载它。

此外,大多数情况下,除非玩家可以在游戏时间或类似情况下编辑游戏对象,否则游戏对象应该保存起来并不是真正的原因。即使这样你仍然可以从使用的“身体部位”或其他任何东西中保存名字,并在需要时从Resources文件夹中加载。

希望这仍然有帮助。

相关问题