Unity_数据持久化_XML存储相关
Unity数据持久化
三、XML数据持久化
3.3 XML文件存储路径与操作
3.3.1 知识点一:决定存储在哪个文件夹下
注意:存储xml文件在Unity中一定是使用各平台都可读可写可找到的路径
各路径评估:
1. Resources 可读不可写 打包后找不到 ×
- 只能读取,无法写入
- 打包后路径不存在
- 不适用于需要修改的XML文件
2. Application.streamingAssetsPath 可读 PC端可写找得到 ×
- 可读取,PC端可写入
- 移动端只读
- 跨平台兼容性有限
3. Application.dataPath 打包后找不到 ×
- 编辑器中可用
- 打包后路径不存在
- 不适用于运行时数据
4. Application.persistentDataPath 可读可写找得到 √
- 所有平台可读可写
- 打包后路径仍然存在
- 推荐用于XML文件存储
3.3.2 知识点二:存储xml文件
核心概念:
XML文件存储是指将XML数据保存到本地文件系统中的过程。在Unity中,我们需要选择合适的存储路径,并使用正确的方法来创建和保存XML文件。
存储位置选择:
// 推荐使用Application.persistentDataPath作为XML文件存储路径
string path = Application.persistentDataPath + "/PlayerInfo2.xml";
基本存储方法:
1. 创建XML文档的五步法
// 关键类:XmlDocument, XmlDeclaration, XmlElement
// 存储有五步// 1. 创建XmlDocument对象
XmlDocument xml = new XmlDocument();// 2. 添加固定版本信息
XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
xml.AppendChild(xmlDec);// 3. 创建根节点
XmlElement root = xml.CreateElement("PlayerInfo");
xml.AppendChild(root);// 4. 创建子节点
XmlElement name = xml.CreateElement("name");
name.InnerText = "张三";
root.AppendChild(name);// 5. 保存文件
xml.Save(path);
2. 复杂数据结构存储
// 存储列表数据
XmlElement listInt = xml.CreateElement("listInt");
for(int i = 0; i < 5; i++)
{XmlElement intElement = xml.CreateElement("int");intElement.InnerText = i.ToString();listInt.AppendChild(intElement);
}
root.AppendChild(listInt);// 存储带属性的列表数据
XmlElement itemList = xml.CreateElement("itemList");
for(int i = 0; i < 5; i++)
{XmlElement itemElement = xml.CreateElement("item");itemElement.SetAttribute("id", i.ToString());itemElement.SetAttribute("num", (i*10).ToString());itemList.AppendChild(itemElement);
}
root.AppendChild(itemList);
3. 完整的XML存储示例
using UnityEngine;
using System.Xml;
using System.IO;public class SaveData : MonoBehaviour
{void Start(){// 设置存储路径string path = Application.persistentDataPath + "/PlayerInfo2.xml";print(path);// 创建XML文档XmlDocument xml = new XmlDocument();// 添加XML声明XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");xml.AppendChild(xmlDec);// 创建根节点XmlElement root = xml.CreateElement("PlayerInfo");xml.AppendChild(root);// 添加基本信息XmlElement name = xml.CreateElement("name");name.InnerText = "张三";root.AppendChild(name);// 添加列表数据XmlElement listInt = xml.CreateElement("listInt");for(int i = 0; i < 5; i++){XmlElement intElement = xml.CreateElement("int");intElement.InnerText = i.ToString();listInt.AppendChild(intElement);}root.AppendChild(listInt);// 添加带属性的列表数据XmlElement itemList = xml.CreateElement("itemList");for(int i = 0; i < 5; i++){XmlElement itemElement = xml.CreateElement("item");itemElement.SetAttribute("id", i.ToString());itemElement.SetAttribute("num", (i*10).ToString());itemList.AppendChild(itemElement);}root.AppendChild(itemList);// 保存文件xml.Save(path);print("保存成功");}
}
通过以上方法,可以安全、高效地在Unity中存储XML文件,为游戏提供可靠的数据持久化解决方案。
3.3.3 知识点三:修改xml文件
核心概念:
XML文件修改是指在已存在的XML文件中更新、添加或删除数据的过程。在Unity中,我们需要先加载XML文件,然后进行修改操作,最后保存文件。
修改XML文件的基本步骤:
1. 加载XML文件
// 检查文件是否存在
if(File.Exists(path))
{// 创建新的XmlDocument对象XmlDocument xml2 = new XmlDocument();// 加载XML文件xml2.Load(path);
}
2. 修改节点内容
// 修改单个节点的文本内容
XmlNode node = xml2.SelectSingleNode("PlayerInfo/name");
node.InnerText = "李四";
xml2.Save(path);
print("修改name成功");
3. 修改列表中的特定元素
// 获取列表节点
XmlNodeList node2 = xml2.SelectNodes("PlayerInfo/listInt/int");
// 修改第一个元素(索引0)
node2[0].InnerText = "100";
xml2.Save(path);
print("修改listInt成功");
4. 修改带属性的元素
// 获取带属性的元素列表
XmlNodeList node3 = xml2.SelectNodes("PlayerInfo/itemList/item");
// 修改第三个元素(索引2)的属性
// 注意:需要将XmlNode转换为XmlElement才能使用SetAttribute
((XmlElement)node3[2]).SetAttribute("num", "100");
((XmlElement)node3[2]).SetAttribute("id", "100");
xml2.Save(path);
print("修改itemList成功");
5. 完整的XML修改示例
using UnityEngine;
using System.Xml;
using System.IO;public class SaveData : MonoBehaviour
{void Start(){string path = Application.persistentDataPath + "/PlayerInfo2.xml";// 先创建XML文件(如果不存在)CreateXmlFile(path);// 修改XML文件if(File.Exists(path)){XmlDocument xml2 = new XmlDocument();xml2.Load(path);// 修改节点内容XmlNode node = xml2.SelectSingleNode("PlayerInfo/name");node.InnerText = "李四";xml2.Save(path);print("修改name成功");// 修改列表元素XmlNodeList node2 = xml2.SelectNodes("PlayerInfo/listInt/int");node2[0].InnerText = "100";xml2.Save(path);print("修改listInt成功");// 修改带属性的元素XmlNodeList node3 = xml2.SelectNodes("PlayerInfo/itemList/item");((XmlElement)node3[2]).SetAttribute("num", "100");((XmlElement)node3[2]).SetAttribute("id", "100");xml2.Save(path);print("修改itemList成功");}}private void CreateXmlFile(string path){// 创建XML文件的代码(与存储部分相同)XmlDocument xml = new XmlDocument();XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");xml.AppendChild(xmlDec);XmlElement root = xml.CreateElement("PlayerInfo");xml.AppendChild(root);XmlElement name = xml.CreateElement("name");name.InnerText = "张三";root.AppendChild(name);// 添加其他元素...xml.Save(path);}
}
修改XML文件的关键要点:
1. 类型转换
SelectNodes
返回的是XmlNodeList
,元素类型是XmlNode
- 修改属性需要使用
SetAttribute
方法,该方法只在XmlElement
中存在 - 需要将
XmlNode
强制转换为XmlElement
:((XmlElement)node3[2])
2. 索引访问
- 使用索引访问列表中的特定元素:
node2[0]
、node3[2]
- 索引从0开始计数
- 确保索引不超出范围
3. 保存操作
- 每次修改后都需要调用
xml2.Save(path)
保存文件 - 如果不保存,修改不会写入文件
4. 错误处理
try
{XmlNodeList node3 = xml2.SelectNodes("PlayerInfo/itemList/item");if (node3.Count > 2){((XmlElement)node3[2]).SetAttribute("num", "100");xml2.Save(path);print("修改成功");}else{print("索引超出范围");}
}
catch (System.Exception e)
{print("修改失败:" + e.Message);
}
通过以上方法,可以安全、高效地修改XML文件,为游戏提供灵活的数据更新能力。