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 概念 事务 是一组…...
3.3 Tessellation Shader (TESS) Geometry Shader(GS)
一、曲面细分着色器的应用 海浪,雪地等 与置换贴图的结合 二、几何着色器的应用 几何动画 草地等(与曲面着色器结合) 三、着色器执行顺序 1.TESS的输入与输出 输入 Patch,可以看成是多个顶点的集合,包含每个顶点的属…...
C++:超越C语言的独特魅力
W...Y的主页😊 代码仓库分享💕 🍔前言: 今天我们依旧来完善补充C,区分C与C语言的区别。上一篇我们讲了关键字、命名空间、C的输入与输出、缺省参数等知识点。今天我们继续走进C的世界。 目录 函数重载 函数重载概…...
【LeetCode】27. 移除元素
1 问题 给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。 不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并 原地 修改输入数组。 元素的顺序可以改变。你不需要考虑数组中超出新…...
AWS SAP-C02教程4--身份与联合身份认证
AWS的账号和权限控制一开始接触的时候觉得很复杂,不仅IAM、Identiy Federation、organization,还有Role、Policy等。但是其实先理清楚基本一些概念,然后在根据实际应用场景去理解设计架构,你就会很快掌握这一方面的内容。 AWS的账号跟其它一些云或者说一些SAAS产品的账号没…...
Mybatis Plus入门进阶:特殊符号、动态条件、公共语句、关联查询、多租户插件
前言 Mybatis Plus入门进阶:特殊符号、动态条件、公共语句、关联查询、多租户插件 隐藏问题:批量插入saveBatch 文章目录 前言注意点动态条件xml公共语句关联查询动态表名使用自定义函数主键生成策略saveBatch插件:多租户TenantLineInnerInte…...
Webpack 什么是loader?什么是plugin?loader与plugin区别是什么?
什么是loader?什么是plugin? loader 本质为一个函数,将文件编译成可执行文件。webpack完成的工作是将依赖分析与tree shinking对于类似.vue或.scss结尾的文件无法编译理解这就需要实现一个loader完成文件转译成js、html、css、json等可执行文…...
js面向对象(工厂模式、构造函数模式、原型模式、原型和原型链)
1.封装 2. 工厂模式 function createCar(color, style){let obj new Object();obj.color color;obj.style style;return obj;}var car1 createCar("red","car1");var car2 createCar("green","car2"); 3. 构造函数模式 // 创建…...
grid网格布局,比flex方便太多了,介绍几种常用的grid布局属性
使用flex布局的痛点 如果使用justify-content: space-between;让子元素两端对齐,自动分配中间间距,假设一行4个,如果每一行都是4的倍数那没任何问题,但如果最后一行是2、3个的时候就会出现下面的状况: /* flex布局 两…...
企业如何凭借软文投放实现营销目标?
数字时代下,软文投放成为许多企业营销的主要方式,因为软文投放成本低且效果持续性强,最近也有不少企业来找媒介盒子进行软文投放,接下来媒介盒子就来给大家分享下,企业在软文投放中需要掌握哪些技巧,才能实…...
【AI】深度学习——循环神经网络
神经元不仅接收其他神经元的信息,也能接收自身的信息。 循环神经网络(Recurrent Neural Network,RNN)是一类具有短期记忆能力的神经网络,可以更方便地建模长时间间隔的相关性 常用的参数学习可以为BPTT。当输入序列比较…...
建设一个自己的网站需要多少钱/百度网址大全 官网
1.将jre改到1.62.工程目录下有一个.settings文件夹,打开org.eclipse.wst.common.project.facet.core.xml做如下修改: <installed facet"jst.web" version"2.5"/>转载于:https://www.cnblogs.com/gavinYang/p/4345145.html...
网站建设专业学什么/搜索引擎优化服务
chidNodes返回的是node的集合,每个node都包含有nodeType属性。 nodeType取值: 元素节点:1 属性节点:2 文本节点:3 注释节点:8页面上是由无数个节点组成,节点分成元素节点、属性节点、文本节点、…...
网站建设应考虑哪些方面的问题/长沙大型网站建设公司
现象: 现在大多数java开发者使用的IDE都是eclipse,而且一般在一个workspace中,会有很多个项目,有些是open的,有些是关闭的。有时候eclipse在使用过程中会莫名其妙的异常中断关闭,再打开eclipse,…...
怎么做网赌网站/网络营销的方式和方法
前言 Javascript是一门基于对象的动态语言,也就是说,所有东西都是对象,一个很典型的例子就是函数也被视为普通的对象。Javascript可以通过一定的设计模式来实现面向对象的编程,其中this “指针”就是实现面向对象的一个很重…...
绍兴网站制作多少钱/爱站小工具计算器
1. 打开ppt,将即将打印的部分编辑好,再 另存为—>文件格式请选择windows 图元文件,保存好即可! 2.打开word,使用word的宏,编辑这些图片的宏代码: (1) 点击“工具”…...
广东门户网站建设/淘宝推广平台
author:skate time:2012/05/24 数据结构设计(表,索引的创建)的说明 表的设计 1.数据类型的选择 1) 数字类型:分为整数数据类型和浮点数据类型,它们之间的区别是取值范围不同,存储…...