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

这篇具有很好参考价值的文章主要介绍了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

playerdata.u3d,Unity引擎,C#,unity,数据库,mysql

②解析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 语句,通常用于更新、插入、删除等不返回数据集的操作。它返回受影响的行数。文章来源地址https://www.toymoban.com/news/detail-767897.html

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——数据存储的几种方式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 使用U3D、pico开发VR(一)——将unity的场景在设备中呈现

           最近srtp项目在赶进度,自己之前是在电脑端进行的开发。但是项目是VR端,因此需要重新学习,在此记录一下自己的学习经历。        首先,如何将unity的场景在自己的眼镜中进行呈现呢?        对此,我也找了很多教程,也跟着花了很多时间去做。从国内的

    2024年01月17日
    浏览(49)
  • U3D客户端框架之 音效管理器 与 Fmod介绍安装导入Unity

    Unity内置的Audio底层使用的是FMOD,但是功能不够齐全,高级一点的功能如混合(Mix)等无法使用; 音效管理应该和Unity工程解耦合,这样子可以减轻音效设计师的负担; 使用FMOD后,游戏中我们只需要关心sound event名字就可以了,对具体音效资源不会产生依赖; 目前FMOD支持Windo

    2024年02月02日
    浏览(37)
  • Unity骚操作:更改u3d导出apk时候所使用的 gradle、GradleTemplates、VisualStudioGradleTemplates、minifyEnabled是否开启混淆等

    测试unity版本:5.6.4 gradle文件夹:里面的是一些unity用自身打包apk时候用到的一些工具 GradleTemplates文件夹:    libTemplate.gradle  mainTemplate.gradle  settingsTemplate.gradle 附上让Unity自身打APK的时候 使用上镜像并且设置上 build:gradle通用工具让 需要生成AS工程的时候 可以让AS识别

    2024年02月14日
    浏览(44)
  • Unity物体移动的几种方式

    主要是Vector3的内置函数以及CharacterController的Move 还有一个固定的每帧进行移动的操作

    2024年02月12日
    浏览(27)
  • UNITY--读取Excel的几种方式

    目录 一.DLL插件读取 1.1.Excel存放位置 1.2.使用示例 1.3.Excel格式  1.4.输出显示  1.5.所需插件 二.Excel转成Asset文件,再进行读取 2.1Excel文件存放位置 2.2 编辑模式生成Asset文件,并保存到指定位置  2.3创建ExcelRead脚本,读取Excel内容 2.4 创建数据存储脚本 2.5  编辑器生成Asset 与属

    2024年01月20日
    浏览(40)
  • Unity解析JSON的几种方式

    1.使用JsonUtility(Unity自带)解析数据 踩坑 2.使用Newtonsoft.Json dll解析json 链接: link 3.使用LitJson解析数据 4.传递给前端或后端 json

    2024年02月16日
    浏览(34)
  • Unity按钮事件的几种绑定方式

    许久没有写C#代码了,对于一些东西自己给整忘了,在此记录下,方便以后自己查阅 获取到按钮组件,我是将代码挂载在其父节点上。 在代码中获取此按钮,并对他就进行绑定。一般都是使用的这类情况。 在脚本中写一个public函数,作为按钮的监听函数,在按钮的Inspector面

    2024年02月11日
    浏览(34)
  • Unity中人物移动的几种方式

    1.使用Transform组件         (1)transform.position(最基础,最常用): 这是通过上下左右键控制人物运动的方法          //获取水平按键,左键或A 则值为-1f,右键或D 则值为1f         horizontal = Input.GetAxis(\\\"Horizontal\\\");         //获取垂直按键,上键或W 则值为-1f,下键或S 则

    2023年04月15日
    浏览(26)
  • Unity中获取游戏对象的几种方式

    在学习如何获取物体和组件时先明白说明什么是物体,组件和对象。 物体:unity中在层级显示的东西都可以叫做物体 组件:unity中提供了大量已经写好的组件,比如刚体,碰撞体等,自己 编写的脚本也是一种组件类 对象:挂载到物体上的脚本是一个实例化的组件,也就是一

    2024年01月17日
    浏览(24)
  • Unity中常用的几种读取本地文件方式

    使用的命名空间如下 using LitJson; using System.Collections.Generic; using System.IO; using System.Text; using UnityEngine; using UnityEngine.Networking; 1、通过UnityWebRequest获取本地StreamingAssets文件夹中的Json文件 View Code 2、通过UnityWebRequest和StreamReader读取本地StreamingAssets文件夹中的Json文件 View Code  3、通

    2024年02月04日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包