当前位置: 首页 > 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.dtcms.com/a/311177.html

相关文章:

  • 第三十九章:AI导演的“魔法时间轴”:文生视频与Video Latent扩散结构
  • [ LeetCode-----盛最多的水]
  • c++ 链表知识汇总
  • FreeRTOS源码分析一:task创建(RISCV架构)
  • 【Pytorch✨】LSTM 入门
  • 用 Qt 打造优雅的密码输入框:添加右侧眼睛图标切换显示
  • 云环境K8s集群WebSocket连接失败解决方案
  • 深入解析 <component :is> 在 Vue3 组合式中的使用与局限
  • 关于Web前端安全防御之点击劫持的原理及防御措施
  • Docker容器中文PDF生成解决方案
  • JavaScript特殊集合WeakMap 的使用及场景介绍
  • C++ lambda表达式与线程库
  • String boot 接入 azure云TTS
  • 20250802安装CP2102N的驱动程序(适配飞凌的OK3576-C)
  • 如何在Ubuntu上部署excalidraw
  • Seal Report:一款免费开源的报表工具
  • 使用 BERT 的 NSP 实现语义感知切片 —— 提升 RAG 系统的检索质量
  • 计算机网络:什么是任播
  • 【计算机网络】Socket网络编程
  • 从零开始构建AI Agent评估体系:12种LangSmith评估方法详解
  • QUdpSocket 详解:从协议基础、通信模式、数据传输特点、应用场景、调用方式到实战应用全面解析
  • Linux网络编程【基于UDP网络通信的字典翻译服务】
  • M|银翼杀手
  • Web 开发 10
  • K8s+Nginx-ingress+Websocket基础知识理解
  • 系统思考:超越线性分析
  • python创建一个excel文件
  • MyBatis 批量操作 XML 实现方式
  • 【BTC】挖矿难度调整
  • Vue 详情模块 3