由于计算机的硬盘只能保存数据,不能直接保存对象,因此想要进行游戏存档,就必须要对游戏中的对象进行序列化,将其转为二进制数据,如果想要读取,就要将数据进行反序列化,将数据转变为对象


序列化的方法

  • unity自带的序列化
  • 代码
  • 使用Json进行序列化
  • 保存数据
  • 读取数据
  • 使用二进制序列化
  • 使用


unity自带的序列化

unity提供了PlayerPrefs,可以进行一些简单的存取功能,可以保存int,float和string三种,分别对应
PlayerPrefs.SetInt(“保存的名称”,数字) PlayerPrefs.SetFloat(“保存的名称”,数字) PlayerPrefs.SetString(“保存的名称”,“字符串”)
读取数据:PlayerPrefs.GetInt(“保存的名称”);
PlayerPrefs.GetInt(“保存的名称”);
PlayerPrefs.GetFloat(“保存的名称”);
PlayerPrefs.GetString(“保存的名称”);

代码

public class Data
{
    public int hp;
    public string name;
    public float level;
 }

public class SaveandLoad : MonoBehaviour
{
    int Hp;
    float Level;
    string Name;
    void Start()
    {
        Hp = PlayerPrefs.GetInt("hp");
        Level = PlayerPrefs.GetFloat("level");
        Name = PlayerPrefs.GetString("name");
        Debug.Log(Hp);
        Debug.Log(Level);
        Debug.Log(Name);
    }
    void Update()
    {
        Demo();
    }
    void Demo()
    {
        Data data = new Data();
        data.name = "大美女";
        PlayerPrefs.SetString("name", data.name);
        if (Input.GetKeyDown(KeyCode.A))
        {
            Hp++;
            Level += 0.1f;
            data.hp = Hp;
            data.level = Level;
            PlayerPrefs.SetInt("hp", data.hp);
            PlayerPrefs.SetFloat("level", data.level);
        }
        if (Input.GetKeyDown(KeyCode.B))
        {
            Hp = 0;
            Level = 0;
            PlayerPrefs.SetInt("hp", data.hp);
            PlayerPrefs.SetFloat("level", data.level);
        }
    }
 }

使用Json进行序列化

Json和Xml一样,内容是用文本表示的,便于直接阅读
支持的数据类型:数字(int和double 不支持float)
字符串
布尔
对象(使用大括号括起来的数据,每组数据的内容是键:值的形式)
数组(使用[]括起来)
使用Json要导入LitJSON.dll 您可以在资源商店中下载

保存数据

保存数据可以使用JsonMapper.ToJson()方法把对象转化为Json字符串,保存到文本文档中

public class Data
{
  public int Hp;
  public int Mp;
  public double Level;
  public string name;
}
public class SaveByJson : MonoBehaviour
{
void Save()
{
  Data data =new Data();
  data.Hp=100;
  data.Mp=100;
  data.Level=111.1f;
  data.name="如花";
  //将对象转为数据字符串
  string json=JsonMapper.ToJson(data);
  //要引入IO,设置文档的存放位置
  string path=Application.persistentDataPath+"/demo.json"
  using(FileStream fs=new FileStream(path,FileMode.Creat))
  {
  //将字符串转为字节码,指定编码为utf-8
    byte[] vs=System.Text.Ecoding.UTF8.GetBytes(json);
    fs.Write(vs,0,vs.Length);
  }
  Debug.Log("保存成功");
  }
}

读取数据

public class Data
{
  public int Hp;
  public int Mp;
  public double Level;
  public string Name;
}
public class LoadByJson:MonoBehavior
{
  void Load()
  {
  Data data=new Data();
  TextAsset json=Resources.Load<TextAsset>("demo");//将刚才生成的json放到Resources文件夹下
  data=JsonMapper.ToObject<Data>(json.text);
  Debug.Log(data.Hp);
  Debug.Log(data.Mp);
  Debug.Log(data.Level);
  Debug.Log(data.Name); 
  }
}

使用二进制序列化

使用二进制序列化时要使用[Serializable]来声明是否需要序列化,用于修饰类或者使用[NonSerializable]来声明不需要序列化

[Serializable]
public class Data
{
  public int hp;
  public int mp;
  public double level;
  public string name;
  [NonSerializable]
  public double no;
}
序列化Data类但是不序列化类中的no成员

使用

void StreamBy2bit()
{
  Data data=new Data();
  data.hp=100;
  data,mp=100;
  data.level=111.111f;
  data.name="如花";
  data.no=23.12;
  ///开始序列化
  MemoryStream stream=new MemoryStream();//创建内存流
  BinaryFormatter formatter=new BinaryFormatter();//二级制格式化器,用来将对象序列化至内存流
  formatter.Serialize(stream,data);//将对象data序列化到内存流stream中 
  ///反序列化
  stream.Seek(0,SeekOrigin.Begin);//回到数据流的开头
  Data data=formatter.Deserialize(stream) as Data;
  Debug,Log(data);
}