Unity——数据存储的几种方式

news2024/11/24 18:41:12

一、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

一般是工具方法,实现打开数据库,关闭数据库,增删改查等功能

  1. LeiSqlHelper 构造函数:接受数据库连接所需的参数(如主机地址、端口、用户名、密码、数据库名等),用于初始化数据库连接。

  2. Connect 方法:根据提供的连接信息来建立数据库连接。它将连接字符串创建并初始化了 MySqlConnection 对象。

  3. Open 方法:用于打开数据库连接。

  4. Close 方法:用于关闭数据库连接。

  5. Dispose 方法:用于在 using 块中释放资源,主要是调用 Close 方法。

  6. Select 方法:执行查询语句,允许你选择指定表的指定字段或选择整个表的所有字段,并返回一个包含结果的 DataSet。

  7. SelectWhere 方法:执行有条件的查询,你可以为查询指定条件,根据条件筛选数据,并返回一个包含结果的 DataSet。

  8. UpdateIntoSpecific 方法:执行更新操作,允许你根据条件更新指定表的特定字段。

  9. InsertInto 方法:执行插入操作,允许你向指定表插入数据。

  10. Delete 方法:执行删除操作,允许你删除符合条件的表中的数据或整个表的内容。

  11. CreateTable 方法:执行创建表的操作,允许你创建一个新的数据库表。

  12. 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);
            }
        }
    }
}

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

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

相关文章

【算法|前缀和系列No.3】leetcode LCR 012. 寻找数组的中心下标

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【leetcode)】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

ThinkPHP5小语种学习平台

有需要请加文章底部Q哦 可远程调试 ThinkPHP5小语种学习平台 一 介绍 此小语种学习平台基于ThinkPHP5框架开发&#xff0c;数据库mysql&#xff0c;前端bootstrap。平台角色分为学生&#xff0c;教师和管理员三种。学生注册登录后可观看学习视频&#xff0c;收藏视频&#xf…

mysql查看连接池的命令

查看实时连接的个数 &#xff08;瞬时值&#xff09; SHOW STATUS LIKE Threads_connected; 查看具体的链接信息 show full processlist;

直播回顾 | 京东科技研发效能度量的大体系与小实践

9 月 27 日思码逸 DevData Talks 邀请到了京东科技测试架构师刘刚。他以《研发效能度量之大体系小实践》为主题&#xff0c;分享了如何以集团的研发效能度量体系作为指引&#xff0c;在所属部门落地适应自己团队和业务特点的度量体系&#xff0c;并取得有效的改进成果。其中他还…

九.镜头知识之CRA(ChiefRay Angle) 主光线角度

九.镜头知识之CRA(ChiefRay Angle) 主光线角度 文章目录 九.镜头知识之**CRA(ChiefRay Angle) 主光线角度**1.9.1 Sensor接收光能1.9.1.1 CRA 定义1.9.1.2 Lens CRA1.9.1.3 Sensor CRA1.9.2 Lens和Sensor搭配的三个重要参数1.9.2.1 ov7251 cra定义:主光线角度为主光线与平行光…

ubuntu18.04 LTS卸载qtcreator-10.0.2

之前通过命令&#xff0c;通过.run文件&#xff0c;安装了Qt Creator 默认安装路径是/opt/ 卸载 在安装路径下&#xff0c;可以看到QtCreatorUninstaller文件 命令行运行该执行文件&#xff0c;会弹出卸载窗口&#xff0c;记得勾选下面的“仅卸载”

如何在不牺牲质量的情况下降低采购成本?

采购成本对许多企业来说都是一笔不小的开支&#xff0c;要在不降低质量的前提下节省开支总是很难兼顾。 现在&#xff0c;端到端的**采购管理软件**8Manage SRM提供了一整套工具和功能&#xff0c;旨在支持采购最佳实践并优化流程。通过以下方式&#xff0c;该软件可以帮助你降…

【SWAT水文模型】SWAT水文模型建立及应用第六期:参数敏感性分析

SWAT CUP的下载及安装参见另一博客-【SWAT水文模型】SWAT-CUP安装及使用。本博客主要介绍SWAT模型参数敏感性分析。 SWAT模型参数敏感性分析&#xff08;SWAT CUP&#xff09; 原理率定参数 操作步骤Step1&#xff1a;Step2&#xff1a;Step3&#xff1a; 参考 在 ArcSWAT201…

42.会话划分问题求解(打标)

思路分析&#xff1a; &#xff08;1&#xff09;为每一次浏览找到他的上一次浏览时间 lag(view_timestamp, 1, 0) over(partition by user_id order by view_timestamp) as last_view_timestamp &#xff08;2&#xff09;为&#xff1e;60s的设置一个初始会话的标签flagif(vi…

REF543KB127AAAA 支持整个企业的有效扩展规划和分析

REF543KB127AAAA 支持整个企业的有效扩展规划和分析 OneStream首席执行官Tom Shea表示:“放眼市场&#xff0c;能够在不依赖数据科学团队或第三方工具的情况下处理大量数据以进行预测决策的FP&A供应商并不多。“我们新的内置人工智能和人工智能功能将使财务和运营团队能够…

【LeetCode刷题(数据结构与算法)】:对链表进行插入排序

给定单个链表的头 head &#xff0c;使用 插入排序 对链表进行排序&#xff0c;并返回 排序后链表的头 插入排序 算法的步骤: 插入排序是迭代的&#xff0c;每次只移动一个元素&#xff0c;直到所有元素可以形成一个有序的输出列表 每次迭代中&#xff0c;插入排序只从输入数据…

【Leetcode】 96. 不同的二叉搜索树

给你一个整数 n &#xff0c;求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种&#xff1f;返回满足题意的二叉搜索树的种数。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;5 示例 2&#xff1a; 输入&#xff1a;n 1 输出&#xff1a…

搭建可远程访问的服务:利用Apache和内网穿透实现公网访问

文章目录 前言1.Apache服务安装配置1.1 进入官网下载安装包1.2 Apache服务配置 2.安装cpolar内网穿透2.1 注册cpolar账号2.2 下载cpolar客户端 3. 获取远程桌面公网地址3.1 登录cpolar web ui管理界面3.2 创建公网地址 4. 固定公网地址 前言 Apache作为全球使用较高的Web服务器…

innovus:stripe下不放std cell的命令

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 一些drc问题在place阶段就可以检查出来&#xff0c;比如preroute drc&#xff0c;这种就是standard cell的pin shape和power plan之间的drc问题&#xff0c;可能是和pg via也可能是和stripe。 为了避…

锁定云栖大会!共同见证阿里云大数据+AI产品年度重磅发布及创新

2023 云栖大会将于 10.31-11.2 在杭州云栖小镇举办&#xff0c;深度拥抱大数据AI 核心技术&#xff0c;见证阿里云大数据AI产品年度重磅发布及创新。开放融合的科技展示平台&#xff0c;汇聚生态、启迪想象。在这里&#xff0c;共同探索智能时代的无线机遇和未来。 阿里云大数…

Vue3集成高德地图:快速上手,实现你的业务需求

Vue3集成高德地图 前言一、准备工作1.开发文档2.添加应用 二、使用步骤命令安装2.地图容器创建3.组件引入4.js api 安全密钥5.初始化地图6. 图层6.1 添加 / 设置 / 获取 / 移除图层6.1.1 添加图层6.1.2 设置图层6.1.3 获取图层6.1.4 移除图层 7. 点标记8. 信息窗体8.1 默认信息…

Qt 为Android app添加系统签名

Qt 为Android app添加系统签名 flyfish 一 环境 lsb_release -aNo LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 23.04 Release: 23.04 Codename: lunarQt Creator 10.0.2 构建套件 Qt 6.5.1 Clang arm64-v8a 二 运行Qt 如果没有Qt图标 在终端…

【Springboot】Filter 过滤器的使用

一、基本介绍 过滤器 Filter 作为 Java 三大器之一&#xff0c;在 Java Web 的使用中有很高的地位。所谓过滤器&#xff0c;就是实现了 javax.servlet.Filter 接口的服务器端程序&#xff0c;就是对事物进行过滤的。在 Web 中的过滤器&#xff0c;当然就是对请求进行过滤&#…

2023常见自动化测试工具集合

1、Appium -------> AppUI自动化测试 官网&#xff1a;http://appium.io Appium 是一个移动端自动化测试开源工具&#xff0c;支持iOS 和Android 平台&#xff0c;支持Python、Java 等语言&#xff0c;即同一套Java 或Python 脚本可以同时运行在iOS 和Android平台&#x…

关于图像分割SDK的一些基础认识

随着科技的不断发展&#xff0c;图像分割SDK已经成为了一个备受关注的话题。而在众多图像分割SDK中&#xff0c;美摄图像分割SDK以其独特的功能和优势脱颖而出。本文将从美摄图像分割SDK的企业价值和互联网娱乐方面&#xff0c;介绍其宣传文章的具体写作规范。 在企业价值方面&…