由于计算机的硬盘只能保存数据,不能直接保存对象,因此想要进行游戏存档,就必须要对游戏中的对象进行序列化,将其转为二进制数据,如果想要读取,就要将数据进行反序列化,将数据转变为对象
序列化的方法
- 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);
}