unity3d———xml 存储数据例子

1.代码示例:

public void SaveData(string fileName){//决定存储路径string path = Application.persistentDataPath + "/" + fileName + ".xml";Debug.Log(Application.persistentDataPath);//5个步骤//1.创建我们的Xml文本 XmlDocument xml = new XmlDocument();//2.添加固定内容XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");xml.AppendChild(xmlDec);//3.添加根节点XmlElement playerInfo = xml.CreateElement("PlayerInfo");xml.AppendChild(playerInfo);//4.添加子节点 或者 属性相关XmlElement name = xml.CreateElement("name");name.InnerText = this.name;playerInfo.AppendChild(name);XmlElement atk = xml.CreateElement("atk");atk.InnerText = this.atk.ToString();playerInfo.AppendChild(atk);XmlElement def = xml.CreateElement("def");def.InnerText = this.def.ToString();playerInfo.AppendChild(def);XmlElement moveSpeed = xml.CreateElement("moveSpeed");moveSpeed.InnerText = this.moveSpeed.ToString();playerInfo.AppendChild(moveSpeed);XmlElement roundSpeed = xml.CreateElement("roundSpeed");roundSpeed.InnerText = this.roundSpeed.ToString();playerInfo.AppendChild(roundSpeed);//weaponXmlElement weapon = xml.CreateElement("weapon");XmlElement id = xml.CreateElement("id");id.InnerText = this.weapon.id.ToString();weapon.AppendChild(id);XmlElement num = xml.CreateElement("num");num.InnerText = this.weapon.num.ToString();weapon.AppendChild(num);playerInfo.AppendChild(weapon);//listIntXmlElement listInt = xml.CreateElement("listInt");for (int i = 0; i < this.listInt.Count; i++){XmlElement intNode = xml.CreateElement("int");intNode.InnerText = this.listInt[i].ToString();listInt.AppendChild(intNode);}playerInfo.AppendChild(listInt);//itemListXmlElement itemList = xml.CreateElement("itemList");for (int i = 0; i < this.itemList.Count; i++){XmlElement itemNode = xml.CreateElement("Item");itemNode.SetAttribute("id", this.itemList[i].id.ToString());itemNode.SetAttribute("num", this.itemList[i].num.ToString());itemList.AppendChild(itemNode);}playerInfo.AppendChild(itemList);//itemDicXmlElement itemDic = xml.CreateElement("itemDic");foreach (int key in this.itemDic.Keys){//keyXmlElement intNode = xml.CreateElement("int");intNode.InnerText = key.ToString();itemDic.AppendChild(intNode);//valueXmlElement itemNode = xml.CreateElement("Item");itemNode.SetAttribute("id", this.itemDic[key].id.ToString());itemNode.SetAttribute("num", this.itemDic[key].num.ToString());itemDic.AppendChild(itemNode);}playerInfo.AppendChild(itemDic);//5.存储xml.Save(path);}
}

数据结构部分:

public class Item
{public int id;public int num;
}   public string name;public int atk;public int def;public float moveSpeed;public float roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic;

 都位于PlayerInfo类中  数据结构跟SaveData方法

2.归纳

  1. 文件路径

    • 使用 Application.persistentDataPath 获取Unity推荐的持久化数据存储路径。
    • 文件名由传入的 fileName 参数和 .xml 扩展名组成,确保文件是XML格式。
  2. 日志输出

    • 使用 Debug.Log 输出持久化数据路径,方便开发者确认文件存储位置。
  3. XML文档创建

    • 使用 XmlDocument 类创建一个新的XML文档实例。
  4. XML声明

    • 使用 CreateXmlDeclaration 方法创建XML声明节点,指定版本、编码和独立性声明。
  5. 根节点

    • 使用 CreateElement 方法创建根节点 PlayerInfo,并将其添加到XML文档中。
  6. 子节点

    • 使用 CreateElement 创建子节点,并使用 InnerText 属性设置节点的文本内容。
    • 包括基本属性(如 nameatkdef 等)和复杂数据结构(如 weaponlistIntitemList 和 itemDic)。
  7. 复杂数据结构

    • weapon:包含 id 和 num 子节点。
    • listInt:循环遍历列表 listInt,为每个整数创建一个子节点。
    • itemList:循环遍历列表 itemList,为每个项目创建一个带有 id 和 num 属性的 Item 节点。
    • itemDic:循环遍历字典 itemDic,为每个键值对创建一个 int 节点和一个带有 id 和 num 属性的 Item 节点。
  8. 文件存储

    • 使用 xml.Save(path) 将构建好的XML文档保存到指定的文件路径。
  9. 数据绑定

    • 通过 this.namethis.atk 等成员变量,将当前对象的数据绑定到XML节点中。
  10. 类型转换

    • 使用 ToString 方法将非字符串类型的数据转换为字符串,以便存储在XML文件中。
  11. 属性设置

    • 使用 SetAttribute 方法为XML节点设置属性。
  12. 文件操作

    • 代码中没有显式的错误处理或文件操作异常处理,这在实际应用中可能需要添加。
  13. 数据结构表示

    • 代码展示了如何将对象的复杂数据结构(如列表和字典)转换为XML格式。
  14. 代码的局限性

    • 代码假设所有数据都是可以被序列化为XML的,没有处理可能存在的循环引用或不支持的类型。
  15. 扩展性

    • 代码结构允许容易地添加更多的数据字段或修改现有的数据结构。
  16. 性能考虑

    • 对于大量数据的写入,XML文件操作可能会影响性能,需要考虑优化或使用更适合大量数据的存储格式。

3.Application.persistentDataPath

Application.persistentDataPath 是Unity引擎中一个非常有用的属性,它提供了一个适合存储持久化数据的目录路径。这个路径指向的目录用于存放那些需要在应用程序关闭后仍然保留的数据,比如玩家的游戏进度、配置文件、缓存数据等。以下是关于 Application.persistentDataPath 的一些详细说明:

特点

  1. 持久化存储

    • 存储在该路径下的数据不会因为应用程序重启而丢失,这使得它非常适合存储需要持久化的数据。
  2. 跨平台

    • Unity自动处理不同操作系统的路径差异,使得开发者可以使用统一的路径来访问持久化数据。
  3. 可写入

    • 你可以在这个路径下创建、修改和删除文件,Unity保证了这个路径在运行时是可写的。

使用场景

  • 玩家数据:保存玩家的游戏进度、成就、高分等。
  • 配置文件:存储游戏设置,如音量、图形选项等。
  • 缓存数据:缓存下载的内容或预先加载的资源,以加快游戏加载速度。
  • 本地数据库:用于存储和管理本地数据库文件。

平台差异

  • Windows:通常指向用户的文档文件夹下的Unity项目文件夹,例如 C:\Users\用户名\Documents\Unity Projects\ProjectName
  • macOS:通常指向用户的Library/Application Support/ProjectName目录。
  • Linux:通常指向 ~/.local/share/CompanyName/ProjectName
  • Android:指向内部存储的 /data/data/<package_name>/files 目录。
  • iOS:指向沙盒目录 Documents/

访问和使用

在Unity中,你可以直接通过以下方式访问 Application.persistentDataPath

string path = Application.persistentDataPath + "/myData.xml";

这行代码将 myData.xml 文件的路径设置为持久化数据路径加上文件名。

注意事项

  • 权限:在某些平台上,特别是移动设备,你可能需要请求文件系统权限才能访问或修改文件。
  • 路径操作:在构建应用程序之前,确保正确处理路径和文件操作,避免运行时错误。
  • 测试:在不同的平台上测试文件的读写操作,确保跨平台兼容性。

示例代码

以下是一个简单的示例,展示如何使用 Application.persistentDataPath 保存一个文本文件:

using UnityEngine;
using System.IO;public class DataSaver : MonoBehaviour
{void Start(){string filePath = Application.persistentDataPath + "/gameData.txt";File.WriteAllText(filePath, "Hello, Unity!");Debug.Log("Data saved to: " + filePath);}
}

这段代码在游戏启动时将字符串 "Hello, Unity!" 写入到 gameData.txt 文件中,并输出文件的保存路径。

总之,Application.persistentDataPath 是Unity提供的一个强大工具,使得管理持久化数据变得简单和跨平台。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/62389.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RHCE作业五-shell脚本

一要求&#xff1a; 通过shell脚本分析部署nginx网络服务 1.接收用户部署的服务名称 2.判断服务是否安装 ​ 已安装&#xff1b;自定义网站配置路径为/www&#xff1b;并创建共享目录和网页文件&#xff1b;重启服务 ​ 没有安装&#xff1b;安装对应的软件包 3.测试 判断服务…

Java基础之控制语句:开启编程逻辑之门

一、Java控制语句概述 Java 中的控制语句主要分为选择结构、循环结构和跳转语句三大类&#xff0c;它们在程序中起着至关重要的作用&#xff0c;能够决定程序的执行流程。 选择结构用于根据不同的条件执行不同的代码路径&#xff0c;主要包括 if 语句和 switch 语句。if 语句有…

CSS新特性(11)

一.计算盒子宽度calc函数&#xff0c;可以用加减乘除来计算 -*/ 让父盒子永远比子盒子小30像素 二.CSS3过渡transition搭配hover一起使用 该盒子宽度可以从200px到400px,谁做变化给谁加 不仅要写宽还要写高利用逗号&#xff0c;多个属性一起写都用逗号 既想要宽度变又想要高度…

MacOS 配置github密钥

MacOS 配置github密钥 1. 生成GitHub的SSH密钥对 ssh-keygen -t ed25519 -C "xxxxxxx.com" -f ~/.ssh/id_ed25519_github 其中 xxxxxxxxxxx.com 是注册github、gitee和gitlab的绑定账号的邮箱 -t ed25519:生成密钥的算法为ed25519&#xff08;ed25519比rsa速度快&…

linux cenos redis 单机部署

编译安装redis&#xff08;Centos&#xff09; 编译安装前先安装编译基础环境&#xff1a; yum install -y gcc gcc-c yum install -y readline-devel yum install -y zlib-devel yum -y install pcre yum -y install pcre-devel yum -y install openssl yum -y instal…

TI毫米波雷达(七)——high accurary示例分析(二)

概述 之前分析了IWR6843上的高精度测距程序框架&#xff0c;虽然可以看到大致的系统运行过程&#xff0c;但是总有一种“混乱”的感觉。TI为了展现ARM与DSP协作能力将如此“简单”的一个功能分布在多处理器上&#xff0c;结合BIOS以及semaphore、event、mailbox等机制&#xff…

鸿蒙修饰符

文章目录 一、引言1.1 什么是修饰符1.2 修饰符在鸿蒙开发中的重要性1.3 修饰符的作用机制 二、UI装饰类修饰符2.1 Styles修饰符2.1.1 基本概念和使用场景2.1.2 使用示例2.1.3 最佳实践 2.2 Extend修饰符2.2.1 基本概念2.2.2 使用示例2.2.3 Extend vs Styles 对比2.2.4 使用建议…

架构-微服务-服务配置

文章目录 前言一、配置中心介绍1. 什么是配置中心2. 解决方案 二、Nacos Config入门三、Nacos Config深入1. 配置动态刷新2. 配置共享 四、nacos服务配置的核心概念 前言 服务配置--Nacos Config‌ 微服务架构下关于配置文件的一些问题&#xff1a; 配置文件相对分散。在一个…

大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO,VOC,COCO格式标注,4070张图片的数据集

大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO&#xff0c;VOC&#xff0c;COCO格式标注&#xff0c;4070张图片的数据集 数据集分割 4070总图像数 训练组 87&#xff05; 3551图片 有效集 9&#xff05; 362图片 测试集 4% 157图片 预处理 自动定向…

Next.js -服务端组件如何渲染

#题引&#xff1a;我认为跟着官方文档学习不会走歪路 服务器组件渲染到客户端发生了什么&#xff1f; 请求到达服务器 用户在浏览器中请求一个页面。 Next.js 服务器接收到这个请求&#xff0c;并根据路由找到相应的页面组件。服务器组件的渲染 Next.js 识别出请求的页面包含…

架构03-事务处理

零、文章目录 架构03-事务处理 1、本地事务实现原子性和持久性 &#xff08;1&#xff09;事务类型 **本地事务&#xff1a;**单个服务、单个数据源**全局事务&#xff1a;**单个服务、多个数据源**共享事务&#xff1a;**多个服务、单个数据源**分布式事务&#xff1a;**多…

基于深度学习的手势识别算法

基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…

硬件基础22 反馈放大电路

目录 一、反馈的基本概念与分类 1、什么是反馈 2、直流反馈与交流反馈 3、正反馈与负反馈 4、串联反馈与并联反馈 5、电压反馈与电流反馈 二、负反馈四种组态 1、电压串联负反馈放大电路 2、电压并联负反馈放大电路 3、电流串联负反馈放大电路 4、电流并联负反馈放大…

亚马逊开发视频人工智能模型,The Information 报道

根据《The Information》周三的报道&#xff0c;电子商务巨头亚马逊&#xff08;AMZN&#xff09;已开发出一种新的生成式人工智能&#xff08;AI&#xff09;&#xff0c;不仅能处理文本&#xff0c;还能处理图片和视频&#xff0c;从而减少对人工智能初创公司Anthropic的依赖…

Spring Boot教程之十二: Spring – RestTemplate

Spring – RestTemplate 由于流量大和快速访问服务&#xff0c;REST API越来越受欢迎。REST 不是一种协议或标准方式&#xff0c;而是一组架构约束。它也被称为 RESTful API 或 Web API。当发出客户端请求时&#xff0c;它只是通过 HTTP 将资源状态的表示传输给请求者或端点。传…

通过 JNI 实现 Java 与 Rust 的 Channel 消息传递

做纯粹的自己。“你要搞清楚自己人生的剧本——不是父母的续集&#xff0c;不是子女的前传&#xff0c;更不是朋友的外篇。对待生命你不妨再大胆一点&#xff0c;因为你好歹要失去它。如果这世上真有奇迹&#xff0c;那只是努力的另一个名字”。 一、crossbeam_channel 参考 cr…

CSS笔记(一)炉石传说卡牌设计1

目标 我要通过html实现一张炉石传说的卡牌设计 问题 其中必须就要考虑到各个元素的摆放&#xff0c;形状的调整来达到满意的效果。通过这个联系来熟悉一下CSS的基本操作。 1️⃣ 基本概念 在CSS里面有行元素&#xff0c;块元素&#xff0c;内联元素&#xff0c;常见的行元…

GAMES101:现代计算机图形学入门-笔记-09

久违的101图形学回归咯 今天的话题应该是比较轻松的&#xff1a;聊一聊在渲染中比较先进的topics Advanced Light Transport 首先是介绍一系列比较先进的光线传播方法&#xff0c;有无偏的如BDPT&#xff08;双向路径追踪&#xff09;&#xff0c;MLT&#xff08;梅特罗波利斯…

Oracle 数据库 IDENTITY 列

IDENTITY列是Oracle数据库12c推出的新特性。之所以叫IDENTITY列&#xff0c;是由于其支持ANSI SQL 关键字 IDENTITY&#xff0c;其内部实现还是使用SEQUENCE。 不过推出这个新语法也是应该的&#xff0c;毕竟MyQL已经有 AUTO_INCREMENT列&#xff0c;而SQL Server也已经有IDENT…