当前位置: 首页 > 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.lryc.cn/news/608033.html

相关文章:

  • 探索:Uniapp 安卓热更新
  • 智能合约漏洞导致的损失,法律责任应如何分配
  • 医疗后台管理系统开发实践
  • 分类任务当中常见指标 F1分数、recall、准确率分别是什么含义
  • 通过解决docker network connect实现同一个宿主机不同网络的容器间通信
  • 【stm32】点灯及蜂鸣器
  • 深度学习·mmsegmentation基础教程
  • 前端开发(HTML,CSS,VUE,JS)从入门到精通!第三天(JavaScript)
  • ospf作业
  • 关于Web前端安全防御之点击劫持的原理及防御措施
  • winscp 连openwrt 返回127错误码
  • Java设计模式之行为型模式(解释器模式)实现方式举例说明
  • 大文件上传:自定义协议
  • 进程 Vs 线程
  • 电路原理图绘制专业实战教程1
  • 深入 Go 底层原理(十五):cgo 的工作机制与性能开销
  • Minimizing Coins(Dynamic Programming)
  • OAuth 2.0 的安全升级版授权协议 OAuth 2.1 详解
  • 【转】大模型安全治理的现状与展望
  • 【龙芯99派新世界】buildroot快速使用笔记
  • WPFC#超市管理系统(4)入库管理
  • STM32——启动过程浅析
  • Shell【脚本 02】离线安装配置Zookeeper及Kafka并添加service服务和开机启动(脚本分析)
  • Kubernetes Gateway API 详解:现代流量路由管理方案
  • Flink2.0学习笔记:Stream API 窗口
  • ubuntu 系统风扇控制软件 CoolerControl
  • 关于项目发布中到后半夜的一些总结
  • Maven - 并行安全无重复打包构建原理揭秘
  • 公网服务器上Nginx或者Openresty如何屏蔽IP直接扫描
  • 译|Netflix 技术博客:一个利用视觉-语言模型和主动学习高效构建视频分类器的框架