PlayerPrefs
采用键值对的形式对数据进行存储,可以保存int、float、string类型的数据。
用法如下:
// 存储
PlayerPrefs.SetInt("IntParam",1);
PlayerPrefs.SetFloat("FloatParam",1.0f);
PlayerPrefs.SetString("StringParam","123");
PlayerPrefs.Save();
// 读取
int intParam = PlayerPrefs.GetInt("IntParam");
float floatParam = PlayerPrefs.GetFloat("FloatParam");
string stringParam = PlayerPrefs.GetString("StringParam");
// 其他
bool hasIntParam = PlayerPrefs.HasKey("IntParam");
PlayerPrefs.DeleteKey("IntParam");
PlayerPrefs.DeleteAll();
需要注意的是,PlayerPrefs键值对存储的位置位于注册表中
计算机\HKEY_CURRENT_USER\Software\Unity\UnityEditor\组织名\工程名
的目录下
二进制
采用二进制的形式保存游戏数据,需要用到System.Runtime.Serialization.Formatters.Binary
命名空间下的BinaryFormatter
二进制转换器。注意被序列化的类需要有 [Serializable]
标记。
private void SaveByBinary()
{
// 创建二进制转换器
BinaryFormatter bf = new BinaryFormatter();
// 创建文件流
FileStream fileStream = File.Create(Application.dataPath + "/StreamingFile/" + "saveByBi.txt");
// 将对象序列化为二进制写入文件流
bf.Serialize(fileStream,saveContent);
// 关闭文件流
fileStream.Close();
}
保存的数据格式如下:
反序列化:
private void LoadByBinary()
{
// 创建二进制转换器
BinaryFormatter bf = new BinaryFormatter();
// 打开文件流
FileStream fileStream = File.Open(Application.dataPath + "/StreamingFile/" + "saveByBi.txt",FileMode.Open);
// 将文件流中的内容反序列化
Save content =(Save) bf.Deserialize(fileStream);
// 关闭文件流
fileStream.Close();
}
读取的结果如下:
Json
这里采用LitJSON插件进行序列化与反序列化操作。
特别注意:需要进行序列化的类成员变量必须设置为public
特别注意2:需要进行反序列化的类需要有无参构造方法,否则会报错
private void SaveByJson()
{
// 将对象转换为Json字符串
string jsonStr = JsonMapper.ToJson(saveContent);
// 存储文件的路径
string filePath = Application.dataPath + "/StreamingFile/" + "saveByJson.json";
// 创建一个StreamWriter
StreamWriter sw = new StreamWriter(filePath);
// 将Json字符串写入
sw.Write(jsonStr);
// 关闭StreamWriter
sw.Close();
}
保存的数据格式如下:
反序列化:
private void LoadByJson()
{
// 存储文件的路径
string filePath = Application.dataPath + "/StreamingFile/" + "saveByJson.json";
// 创建一个StreamReader
StreamReader sr = new StreamReader(filePath);
String jsonStr = sr.ReadToEnd();
// 关闭StreamReader
sr.Close();
// 将Json转换为Save对象
Save content = JsonMapper.ToObject<Save>(jsonStr);
}
读取的结果如下:
XML
将数据存储为XML文件格式。优点是存储的数据格式较为直观,但缺点是占用空间较大,且存储过程较为繁琐。
private void SaveByXML()
{
// 存储文件的路径
string filePath = Application.dataPath + "/StreamingFile/" + "saveByXML.xml";
// 创建XML文档对象
XmlDocument xmlDoc = new XmlDocument();
// 创建根节点
XmlElement root = xmlDoc.CreateElement("save");
// 设置根节点中的属性
root.SetAttribute("name", "saveContent1");
// 创建students节点
XmlElement students = xmlDoc.CreateElement("students");
// 添加students数据
for (int i = 0; i < saveContent.students.Count; i++)
{
XmlElement student = xmlDoc.CreateElement("student");
XmlElement name = xmlDoc.CreateElement("name");
name.InnerText = saveContent.students[i].name;
XmlElement age = xmlDoc.CreateElement("age");
age.InnerText = saveContent.students[i].age.ToString();
student.AppendChild(name);
student.AppendChild(age);
students.AppendChild(student);
}
// 添加classMessage
XmlElement classMessage = xmlDoc.CreateElement("classMessage");
classMessage.InnerText = saveContent.classMessage;
// 添加到根节点
root.AppendChild(students);
root.AppendChild(classMessage);
// 将根节点添加到xml文档
xmlDoc.AppendChild(root);
// 保存
xmlDoc.Save(filePath);
}
保存的数据格式如下:
反序列化:
private void LoadByXML()
{
// 接收读取的数据
Save content = new Save();
// 存储文件的路径
string filePath = Application.dataPath + "/StreamingFile/" + "saveByXML.xml";
// 创建XML文档对象
XmlDocument xmlDoc = new XmlDocument();
// 载入数据
xmlDoc.Load(filePath);
// 通过节点名称获取元素,结果只能是XmlNodeList
XmlNodeList students = xmlDoc.GetElementsByTagName("students");
if (students.Count > 0)
{
XmlNodeList student = students[0].ChildNodes;
List<Student> studentList = new List<Student>();
if (student.Count > 0)
{
for (int i = 0; i < student.Count; i++)
{
string name = student[i].ChildNodes[0].InnerText;
int age = int.Parse(student[i].ChildNodes[1].InnerText);
Student st = new Student(age, name);
studentList.Add(st);
}
content.students = studentList;
}
}
// 读取classMessage
XmlNodeList classMessage = xmlDoc.GetElementsByTagName("classMessage");
if (classMessage.Count > 0)
{
string msg = classMessage[0].InnerText;
content.classMessage = msg;
}
}
读取的结果如下:
关于LitJSON
LitJSON在GitHub上只提供了源码,并没有提供封装好的dll文件。在此记录一下如何将源码构建成dll。
首先用编译器打开下载好的源码:
如果右下角弹出一堆error的话,检查自己的.Net版本和解决方案的目标框架
注意右下角的.NETStandard版本要选2.0(选了2.1引用的时候可能会报错)
然后右键解决方案构建
最后如果成功的话会输出dll生成路径
按这个路径就能找到构建好的dll文件了