Unity中的存档与读档

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文件了

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值