Unity——数据存储的几种方式
一、PlayerPrefs
PlayerPrefs适合用于存储简单的键值对数据
存储的数据会在游戏关闭后依然保持,并且可以在不同场景之间共享,适合用于需要在游戏不同场景之间传递和保持的数据。
它利用key-value的方式将数据保存到本地,跟字典类似。然后通过代码进行保存、读取、更新操作。值得注意的是此方法只能保存int型、float型,string型的数据,当然,对于bool类型的可以用0和1来代替真和假,以实现保存目的。
示例:制作登录界面的记住密码功能
1:在Start方法中判断PlayerPrefs是否存在该键名,有的话就设置
private void Start(){if (PlayerPrefs.HasKey("Name")) {UserField.text = PlayerPrefs.GetString("Name");}if (PlayerPrefs.HasKey("Password")){PasswordField.text = PlayerPrefs.GetString("Password");}}
2:在登录按钮按下时,去设置该键值
if(rememberToggle.isOn){PlayerPrefs.SetString("Name", UserField.text);PlayerPrefs.SetString("Password", PasswordField.text);}else{PlayerPrefs.DeleteKey("Password");}
PlayerPrefas就是这么简单,就是本地字典,可以离线存储
二、Json/Xml/Excel/Txt(本地)
1:Json
①书写解析类
需要创建和Json格式一样的类,以便于解析该Json文件到该类,不同复杂程度的Json文件,解析方式也不一样,简单的格式可以使用JsonUtility,复杂的则使用LitJson解析
比如Json格式如下:
{"name": "张三","level": 10,"hp": 100.0
}
解析类如下:
public class PlayerData{public string name;public int level;public float hp;}
比如Json格式如下(嵌套格式):
{"name": "John","age": 30,"isStudent": true,"scores": [ 98, 95, 100 ],"address":{"city": "New York","state": "NY"}
}
解析类如下:
public class ExampleData
{public string name;public int age;public bool isStudent;public List<int> scores;public AddressData address;
}
public class AddressData
{public string city;public string state;
}
在Json的格式中,整块的内容需要用到{},数组的内容需要用到[]
②读取和解析Json文件
路径
string filePath = Application.streamingAssetsPath + "/JsonData/player.json";
string jsonString = File.ReadAllText(Application.streamingAssetsPath + "/JsonData/litexample.json");
第一种是文件的路径,第二种则直接把后面的读取该路径下的Json文件也包括了
解析
string jsonString = File.ReadAllText(filePath);
PlayerData playerData1 = JsonUtility.FromJson<PlayerData>(jsonString);
exampleData = JsonMapper.ToObject<ExampleData>(jsonString);
后续只需要对你读取到数据类中的数据进行读取就好了,当然这只是读取,还有存取,后续补
2:XML
①书写XML文件
<?xml version="1.0" encoding="UTF-8"?>
<library><book><title>Unity 3D游戏开发</title><authors><author>张三</author><author>李四</author></authors></book><book><title>Java编程思想</title><authors><author>John Doe</author><author>Jane Doe</author></authors></book>
</library>
<library>
是根元素(root element)。
<book>
元素包含了书的相关信息。<title>
元素用于包含书的标题。<authors>
元素用于包含一个或多个作者。<author>
元素包含作者的名字。
标记的位置表明了层级关系,Library是最高层,就表明它是根节点元素,其次就是Book,Book是有两组,然后是Title和Authors是并列关系的,最后是两个Author
<book>
</book>
注意到这种结构,以尖括号不加/开始,以为尖括号加/结束!
②解析XML类
public class Book
{public string title;public List<string> authors = new List<string>();
}
解析类使用了XML中的最基础的Book数组
③解析方法
string filePath = Application.streamingAssetsPath + "/XMLData/XMLExample.xml";
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(filePath);
XmlDocument是 .NET Framework 提供的 XML 文档处理类,允许你加载、创建、编辑和操作 XML 文档
//写成Static静态方法,可以在全局进行使用
public static List<Book> ParseBooks(XmlDocument xmlDoc){//创建一个Book数组,用于存储数据List<Book> books = new List<Book>();//SelectSingleNode,获取XML的单一节点XmlNode root = xmlDoc.SelectSingleNode("library");//遍历该节点下的所有子节点foreach (XmlNode bookNode in root.ChildNodes){//再创建新的Book对象Book book = new Book();//再获取单一节点book.title = bookNode.SelectSingleNode("title").InnerText;XmlNode authorsNode = bookNode.SelectSingleNode("authors");foreach (XmlNode authorNode in authorsNode.ChildNodes){book.authors.Add(authorNode.InnerText);}books.Add(book);}return books;}
其实使用了xmlDoc.SelectSingleNode方法来选中XMl文件中的一个节点,然后再进行遍历,注意在遍历之前需要先创建对应的数据类进行存储
3:Excel
①导入读取文件
一般是EPPlus,Excel,ICharpCode,用于读取excle
②解析Excel
分成三步
//FileStream是基于IO名称空间
FileStream stream = File.Open(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);//IExcelDataReader是基于Excel名称空间
IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);DataSet result = excelReader.AsDataSet();
第一步:
filePath
:表示要打开的文件的路径。FileMode.Open
:表示以打开的方式打开文件,如果文件不存在则引发异常。FileAccess.Read
:表示以只读模式打开文件,不允许写入。FileShare.Read
:表示文件共享选项,允许多个读取器打开文件并同时读取。
第二步:
创建一个 IExcelDataReader
对象,它用于读取 Excel 文件的内容ExcelReaderFactory.CreateOpenXmlReader
是从 ExcelDataReader 库中创建 Excel 读取器的工厂方法。这里使用的是 OpenXml 格式的读取器,它可以读取基于 Office Open XML 标准的 Excel 文件(.xlsx 格式)。
注意: 读取.xlsx格式的使用ExcelReaderFactory.CreateOpenXmlReader
读取.xls格式的使用ExcelReaderFactory.CreateBinaryReader
第三步:
读取 Excel 文件的内容,并将其转换为 DataSet
对象
③读取Excel
columnNum = result.Tables[0].Columns.Count;
rowNum = result.Tables[0].Rows.Count;
4:Txt
①获取路径
Resources:
string filePath = "MyTextFiles/Example.txt";
StreamingAssets:
string fileName = "Example.txt";
string filePath = Path.Combine(Application.streamingAssetsPath, fileName);
②读取文件
using System.IO;public string ReadTextFile(string filePath)
{try{if (File.Exists(filePath)){// 从文本文件中读取所有文本内容string content = File.ReadAllText(filePath);return content;}else{Debug.LogError("File not found: " + filePath);return null;}}catch (Exception e){Debug.LogError("Error reading text file: " + e.Message);return null;}
}
三、ScriptableObject
ScriptableObject是 Unity 提供的一个数据配置存储基类,它是一个可以用来保存大量数据的数据容器,我们可以将它保存为自定义的数据资源文件,实例会被保存成资源文件(.asset文件),和预制体,材质球,音频文件等类似,都是一种资源文件,存放在 Assets 文件夹下,创建出来的实例也是唯一存在的。
①创建目标数据结构的数据类
namespace Data
{public class Item{public string Name;public string Class;public string Sex;public string Age;}public class ItemManager : ScriptableObject{public Item[] dataArray;}
}
嵌套Item的数组
②编辑Scripts
可以在代码中进行编辑内容,也可以在外部进行编辑
public class ItemParser : MonoBehaviour
{public ItemManager itemManager; // 在Unity中分配你的ItemManager实例private void Start(){if (itemManager != null){// 遍历dataArray中的每个Item对象foreach (Item item in itemManager.dataArray){Debug.Log("Item Name: " + item.Name);Debug.Log("Item Class: " + item.Class);Debug.Log("Item Sex: " + item.Sex);Debug.Log("Item Age: " + item.Age);}}else{Debug.LogError("ItemManager is not assigned!");}}
}
③读取即可
四、数据库
一般使用数据库进行数据的增删改查,我的另一篇关于创建本地数据库的文章写的非常详细,详见:Unity_安装部署本地MySQL数据库(Navicat可视化)_mysql安装 unity_Future_404的博客-CSDN博客
1:SqlHelp
一般是工具方法,实现打开数据库,关闭数据库,增删改查等功能
-
LeiSqlHelper 构造函数:接受数据库连接所需的参数(如主机地址、端口、用户名、密码、数据库名等),用于初始化数据库连接。
-
Connect 方法:根据提供的连接信息来建立数据库连接。它将连接字符串创建并初始化了 MySqlConnection 对象。
-
Open 方法:用于打开数据库连接。
-
Close 方法:用于关闭数据库连接。
-
Dispose 方法:用于在
using
块中释放资源,主要是调用 Close 方法。 -
Select 方法:执行查询语句,允许你选择指定表的指定字段或选择整个表的所有字段,并返回一个包含结果的 DataSet。
-
SelectWhere 方法:执行有条件的查询,你可以为查询指定条件,根据条件筛选数据,并返回一个包含结果的 DataSet。
-
UpdateIntoSpecific 方法:执行更新操作,允许你根据条件更新指定表的特定字段。
-
InsertInto 方法:执行插入操作,允许你向指定表插入数据。
-
Delete 方法:执行删除操作,允许你删除符合条件的表中的数据或整个表的内容。
-
CreateTable 方法:执行创建表的操作,允许你创建一个新的数据库表。
-
ExecuteNonQuery 方法:执行 SQL 语句,通常用于更新、插入、删除等不返回数据集的操作。它返回受影响的行数。
2:SqlToos(读取)
using System.Collections.Generic;
using UnityEngine;
using Lei.Mysql;public class LeiTestSql : MonoBehaviour
{void Start(){// IP地址 端口 用户名 密码 数据库项目名称var mySqlTools = new LeiSqlHelper("127.0.0.1", "3306", "root", "123456", "SqlTest");//先打开数据库mySqlTools.Open();//创建表方法 表名 字段名称 字段类型//mySqlTools.CreateTable("FirstData", new[] { "UID", "User", "Password" }, new[] { "tinytest", "tinytext", "tinytest" });//插入数据 表名 字段名称 插入的数据//mySqlTools.InsertInto("FirstData", new[] { "UID", "User", "Password" }, new[] { "雷康", "leikang", "123456" });//查询方法FindMysql(mySqlTools, "firstdata", new[] { "UID", "User", "Password" });// 插入方法 表名 字段名 插入数据//mySqlTools.InsertInto("firstdata", new[] { "UID", "User", "Password" },new[] {"52022","ddxj1","123456" });// 更新方法 表名 更新字段名 判断符号 更新数据 查询条件字段 条件成立字段//mySqlTools.UpdateIntoSpecific("firstdata", new[] { "User" }, new[] { "=" }, new[] { "ddxj1" }, new[] { "Password" }, new[] { "456789" });// 删除方法 表名 删除字段 判断条件 条件成立数据 //mySqlTools.Delete("firstdata", new[] { "User" }, new[] { "=" }, new[] { "ddxj1" });//查询方法 表名 查询字段名 判断字段名 判断符号 条件成立数据// var ds = mySqlTools.SelectWhere("firstdata", new[] { "UID" }, new[] { "User" }, new[] { "=" }, new[] { "ddxj1" });//查询方法 表名 判断字段名 判断符号 条件成立数据// var ds = mySqlTools.SelectWhere("firstdata", new[] { "User" }, new[] { "=" }, new[] { "ddxj1" });mySqlTools.Close();}/// <summary>/// 查询表中数据 记得先调用Open()方法 用完此方法后直接Close()/// </summary>/// <param name="mySqlTools">Mysql框架类</param>/// <param name="tableName">表名</param>/// <param name="items">字段名称</param>void FindMysql(LeiSqlHelper mySqlTools, string tableName, string[] items){var ds = mySqlTools.Select(tableName, items);//调取获取数据的方法var pairs = LeiSqlTools.TableData(ds);DebugMysql(pairs);}/// <summary>/// 打印查询数据库/// </summary>/// <param name="pairs"></param>private void DebugMysql(Dictionary<string, object>[] pairs){for (int i = 0; i < pairs.Length; i++){foreach (var table in pairs[i]){string tableList = string.Format("第{0}行,表字段名对应数据是 {1}", i + 1, table);print(tableList);}}}
}
相关文章:

Unity——数据存储的几种方式
一、PlayerPrefs PlayerPrefs适合用于存储简单的键值对数据 存储的数据会在游戏关闭后依然保持,并且可以在不同场景之间共享,适合用于需要在游戏不同场景之间传递和保持的数据。 它利用key-value的方式将数据保存到本地,跟字典类似。然后通…...
『heqingchun-ubuntu系统下安装cuda与cudnn』
ubuntu系统下安装cuda与cudnn 一、安装依赖 1.更新 sudo apt updatesudo apt upgrade -y2.基础工具 sudo apt install -y build-essential python二、安装CUDA 1.文件下载 网址 https://developer.nvidia.com/cuda-toolkit-archive依次点击 (1)“CUDA Toolkit 11.6.2”…...

Unity AI Muse 基础教程
Unity AI Muse 基础教程 Unity AI 内测资格申请Unity 项目Package ManagerMuse Sprite 安装Muse Texture 安装 Muse Sprite 基础教程什么是 Muse Sprite打开 Muse Sprite 窗口Muse Sprite 窗口 参数Muse Sprite Generations 窗口 参数Muse Sprite Generations 窗口 画笔Muse Sp…...

pgsl基于docker的安装
1. 有可用的docker环境 ,如果还没有安装docker,则请先安装docker 2. 创建pg数据库的挂载目录 mkdir postgres 3. 下载pg包 docker pull postgres 这个命令下载的是最新的pg包,如果要指定版本的话,则可以通过在后面拼接 :versio…...
idea设置某个文件修改后所在父文件夹变蓝色
idea设置某个文件修改后所在父文件夹变蓝色的方法: 老版idea设置方法: File---->Settings---->Version Control---->勾选 Show directories with changed descendants 新版idea设置方法: File---->Settings---->Version Co…...
代码随想录训练营二刷第五十八天 | 583. 两个字符串的删除操作 72. 编辑距离
代码随想录训练营二刷第五十八天 | 583. 两个字符串的删除操作 72. 编辑距离 一、583. 两个字符串的删除操作 题目链接:https://leetcode.cn/problems/delete-operation-for-two-strings/ 思路:定义dp[i][j]为要是得区间[0,i-1]和区间[0,j-1]所需要删除…...

秋日有感之秋诉-于光
诗:于光 秋风扫叶枝不舍, 叶落随风根欢唱。 秋日穿云不入眼, 云亦婆娑诉余年。...
ubuntu 22.04版本修改服务器名、ip,dns信息的操作方法
总结 1、ubuntu修改服务器名重启后生效的方法是直接修改/etc/hostname文件 2、ubuntu 22.04操作系统配置ip和dns信息,一般只需要使用netplan命令行工具来配置就行,在/etc/netplan/在目录下创建一个yaml文件就可以实现ip和dns的配置,当然如果…...

【微信小程序】6天精准入门(第2天:小程序的视图层、逻辑层、事件系统及页面生命周期)
一、视图层 View 1、什么是视图层 框架的视图层由 WXML 与 WXSS 编写,由组件来进行展示。将逻辑层的数据反映成视图,同时将视图层的事件发送给逻辑层。WXML(WeiXin Markup language) 用于描述页面的结构。WXS(WeiXin Script) 是小程序的一套脚本语言&am…...

速学Linux丨一文带你打开Linux学习之门
前言 如果你是刚开始学习Linux的小白同学,相信你已经体会到与学习一门编程语言相比,学习Linux系统的门槛相对较高,你会遇到一些困惑,比如: 为什么要学习Linux,学成之后我们可以在哪些领域大显身手…...

符尧:别卷大模型训练了,来卷数据吧!【干货十足】
大家好,我是HxShine。 今天分享一篇符尧大佬的一篇数据工程(Data Engineering)的文章,解释了speed of grokking指标是什么,分析了数据工程(data engineering)包括mix ratio(数据混合…...

2023年中国半导体检测仪器设备销售收入、产值及市场规模分析[图]
半导体测试设备是一种用于电子与通信技术领域的电子测量仪器。随着技术发展,半导体芯片晶体管密度越来越高,相关产品复杂度及集成度呈现指数级增长,这对于芯片设计及开发而言是前所未有的挑战,随着芯片开发周期的缩短,…...
诊断DLL——Visual Studio安装与dll使用
文章目录 Visual Studio安装一、DLL简介二、使用步骤1.新建VS DLL工程2.生成dll文件3.自定义函数然后新建一个function.h文件,声明这个函数。4.新建VS C++ console工程,动态引用DLL编写代码,调用dll三、extern "C" __declspec(dllexport)总结Visual Studio安装 官…...

专业课138,总分390+,西工大,西北工业大学827信号与系统考研分享
数学一 考研数学其实严格意义上已经没有难度大小年之分了,说21年难的会说22年简单,说22年简单的做23年又会遭重,所以其实只是看出题人合不合你的口味罢了,建议同学不要因偶数年而畏惧,踏踏实实复习。资料方面跟谁就用…...
css3链接
你可以使用CSS3来自定义链接(超链接)的样式,以改变它们的外观。以下是一些用于自定义链接的常见CSS3样式规则: 链接的颜色: a { color: #0077b6; /* 设置链接的文字颜色 */ } 这个规则可以改变链接的文字颜色。你可以根据需要设置…...

第五章 运输层 | 计算机网络(谢希仁 第八版)
文章目录 第五章 运输层5.1 运输层协议概述5.1.1 进程之间的通信5.1.2 运输层的两个主要协议5.1.3 运输层的端口 5.2 用户数据报协议UDP5.2.1 UDP概述5.2.2 UDP的首部格式 5.3 传输控制协议TCP概述5.3.1 TCP最主要的特点5.3.2 TCP的连接 5.4 可靠传输的工作原理5.4.1 停止等待协…...

CustomTabBar 自定义选项卡视图
1. 用到的技术点 1) Generics 泛型 2) ViewBuilder 视图构造器 3) PreferenceKey 偏好设置 4) MatchedGeometryEffect 几何效果 2. 创建枚举选项卡项散列,TabBarItem.swift import Foundation import SwiftUI//struct TabBarItem: Hashable{ // let ico…...

卡片翻转效果的实现思路
卡片翻转效果的实现思路 HTML 基础布局 <div class"card"><img class"face" src"images/chrome_eSCSt8hUpR.png" /><p class"back"><span>背面背景</span></p> </div>布局完成后如下所示…...

blob和ArrayBuffer格式图片如何显示
首先blob格式图片 <template> <div> <img :src"imageURL" alt"Image" /> </div> </template> <script> export default { data() { return { imageBlob: null, // Blob格式的图片 imageURL: null // 图…...

MySQL学习(四)——事务与存储引擎
文章目录 1. 事务1.1 概念1.2 事务操作1.2.1 未设置事务1.2.2 控制事务 1.3 事务四大特性1.4 并发事务问题1.5 事务隔离级别 2. 存储引擎2.1 MySQL体系结构2.2 存储引擎2.3 存储引擎的特点2.3.1 InnoDB2.3.2 MyISAM2.3.3 Memory2.3.4 区别和比较 1. 事务 1.1 概念 事务 是一组…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...

【VLNs篇】07:NavRL—在动态环境中学习安全飞行
项目内容论文标题NavRL: 在动态环境中学习安全飞行 (NavRL: Learning Safe Flight in Dynamic Environments)核心问题解决无人机在包含静态和动态障碍物的复杂环境中进行安全、高效自主导航的挑战,克服传统方法和现有强化学习方法的局限性。核心算法基于近端策略优化…...

热烈祝贺埃文科技正式加入可信数据空间发展联盟
2025年4月29日,在福州举办的第八届数字中国建设峰会“可信数据空间分论坛”上,可信数据空间发展联盟正式宣告成立。国家数据局党组书记、局长刘烈宏出席并致辞,强调该联盟是推进全国一体化数据市场建设的关键抓手。 郑州埃文科技有限公司&am…...

阿里云Ubuntu 22.04 64位搭建Flask流程(亲测)
cd /home 进入home盘 安装虚拟环境: 1、安装virtualenv pip install virtualenv 2.创建新的虚拟环境: virtualenv myenv 3、激活虚拟环境(激活环境可以在当前环境下安装包) source myenv/bin/activate 此时,终端…...

车载诊断架构 --- ZEVonUDS(J1979-3)简介第一篇
我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 做到欲望极简,了解自己的真实欲望,不受外在潮流的影响,不盲从,不跟风。把自己的精力全部用在自己。一是去掉多余,凡事找规律,基础是诚信;二是…...

rm视觉学习1-自瞄部分
首先先感谢中南大学的开源,提供了很全面的思路,减少了很多基础性的开发研究 我看的阅读的是中南大学FYT战队开源视觉代码 链接:https://github.com/CSU-FYT-Vision/FYT2024_vision.git 1.框架: 代码框架结构:readme有…...