当前位置: 首页 > news >正文

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文件,为游戏提供灵活的数据更新能力。

http://www.xdnf.cn/news/1231939.html

相关文章:

  • web:js的模块导出/导入
  • 从零打造大语言模型--处理文本数据
  • OAuth 2.0 的安全升级版授权协议 OAuth 2.1 详解
  • 基于深度学习的医学图像分析:使用MobileNet实现医学图像分类
  • FFmpeg+javacpp中纯音频播放
  • ffmpeg命令和ffplay命令详解
  • 高效轻量的C++ HTTP服务:cpp-httplib使用指南
  • Linux进程间通信——system V信号量
  • Agents-SDK智能体开发[4]之集成MCP入门
  • 【整数转罗马数字】
  • 探索延迟生效变量类:一种灵活的状态管理机制
  • linux进度条程序
  • WD5208S,12V500MA,应用于小家电电源工业控制领域
  • Z20K118库中寄存器及其库函数封装-WDOG库
  • 深入 Go 底层原理(十):defer 的实现与性能开销
  • hcip---ospf知识点总结及实验配置
  • 淘宝获取商品SKU详情API接口操作指南
  • Python爬虫实战:研究SimpleCV技术,构建图像获取及处理系统
  • 注意点:不同对象(更准确地说,不同类型/类)的魔法方法(Magic Methods,也叫特殊方法,以双下划线`__`开头和结尾)通常是不一样的。
  • 字节Seed发布扩散语言模型,推理速度达2146 tokens/s,比同规模自回归快5.4倍
  • 深入 Go 底层原理(三):Goroutine 的调度策略
  • [论文阅读] 人工智能 + 软件工程 | GitHub Marketplace中CI Actions的功能冗余与演化规律研究
  • Text2SQL:如何通过自然语言直接获取数据,打破技术壁垒?
  • 【Android】通知
  • Docker 的网络模式
  • 红黑树(RBTree)
  • 【LeetCode 热题 100】(四)子串
  • 前端-移动Web-day3
  • 云环境K8s集群WebSocket连接失败解决方案
  • 【REACT18.x】使用vite创建的项目无法启动,报错TypeError: crypto.hash is not a function解决方法