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,一经查实,立即删除!

相关文章

用户该怎么管理维护自己的服务器?

管理和维护自己的服务器是确保其长期稳定、高效和安全运行的重要任务。以下是一些关键的服务器管理和维护的步骤和建议&#xff0c;适用于Linux或Windows服务器。 1.定期备份数据 定期备份是防止数据丢失和恢复故障的关键步骤。备份策略应包括&#xff1a; 全量备份&#xff1a…

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;多个属性一起写都用逗号 既想要宽度变又想要高度…

linuxmysqliptablesfirewalldtcpdump备份恢复常用命令

目录 使用 tar 命令进行备份和恢复 备份 恢复 使用 rsync 命令进行备份和恢复 备份 恢复 使用 cp 命令进行简单的文件备份 备份 恢复 使用 tar 和 cron 定期备份 使用 cloud backup 工具&#xff08;如 rclone&#xff09; 备份到云存储 恢复从云存储 mysql备份恢复…

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速度快&…

React 前端框架深度剖析

摘要&#xff1a; 本文旨在对 React 前端框架进行全面且深入的分析。首先介绍了 React 的起源与发展历程&#xff0c;阐述其核心概念如虚拟 DOM、组件化思想等&#xff0c;详细探讨了 React 的工作原理&#xff0c;包括组件生命周期、数据流动机制等方面。接着对 React 的生态系…

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…

Luma AI技术浅析(五):GAN 改进技术

生成对抗网络&#xff08;Generative Adversarial Networks, GAN&#xff09; 是 Luma AI 用于生成高质量 3D 模型和动画的核心技术之一。GAN 由生成器&#xff08;Generator&#xff09;和判别器&#xff08;Discriminator&#xff09;组成&#xff0c;生成器生成数据&#xf…

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图片 预处理 自动定向…

Flink随笔 20241129 流数据处理:以生产线烤鸡为例理解 Flink

流数据&#xff08;streaming data&#xff09;就像是一条永不停歇的生产线&#xff0c;源源不断地向前推进&#xff0c;带来新的数据。而 Apache Flink 就是这条生产线的核心&#xff0c;它负责对数据进行处理、分类、聚合和存储。为了更好地理解 Flink 的流处理&#xff0c;我…

Langchain 实现 RAG

RAG 实现包括三部分,文档向量化、相似度搜索和大模型回答,本文将使用 LangChain 进行 RAG 的实现。RAG 中最重要的是向量,向量模型的好坏直接反映到最终结果的好坏,如果不能搜索到相对准确的文档,RAG 就没有起到该有的效果。文章将分为两部分,首先是向量索引以及搜索,然…

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

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

如何构建一个高效安全的图书管理系统

文章目录 技术栈功能需求实现步骤1. 准备开发环境2. 创建项目结构3. 配置数据库4. 创建实体类5. 创建仓库接口6. 创建服务类7. 创建控制器8. 创建前端页面9. 运行项目 技术栈 前端&#xff1a;HTML5、CSS3、JavaScript后端&#xff1a;Java&#xff08;Spring Boot框架&#x…

MongoDB注入攻击测试与防御技术深度解析

MongoDB注入攻击测试与防御技术深度解析 随着NoSQL数据库的兴起&#xff0c;MongoDB作为其中的佼佼者&#xff0c;因其灵活的数据模型和强大的查询能力&#xff0c;受到了众多开发者的青睐。然而&#xff0c;与任何技术一样&#xff0c;MongoDB也面临着安全威胁&#xff0c;其…

架构03-事务处理

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