Unity 数据存储和读取的方法汇总

目录
  • 数据场景
  • PlayerPrefs
  • 序列化与反序列化
  • Json
  • XML

在 Unity 中实现对游戏数据存储和读取的方法主要有这几种:

  • 使用本地持久化类 PlayerPrefs
  • 使用二进制的方法序列化和反序列化(Serialize / Deserialize)
  • 使用 Json 方法
  • 使用 XML 方法

数据场景

在 Demo 中分别使用这四种方法实现面板上数据的存储和读取

创建一个 Data 脚本用来序列化和反序列化,需要向这个类中添加需要保存的数据,最后也是需要从这个类中读取保存的数据

需要存储和读取数据的脚本 Data

[System.Serializable]
public class Data
{
    // 关卡/生命值/关卡得分
    public int levels;
    public int health;
    public int scores;
}

向 Data 中存储和读取数据的方法

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

/// <summary>
/// 数据管理
/// </summary>
public class DataManager : MonoBehaviour
{
    // 创建 Data 对象,并添加需要保存的数据
    private Data GetGameData()
    {
        Data data = new Data();
        data.levels = CanvasManager.Instance.levels;
        data.health = CanvasManager.Instance.health;
        data.scores = CanvasManager.Instance.scores;

        return data;
    }

    // 向游戏中加载 Data 中保存的数据
    private void SetGameData(Data data)
    {
        CanvasManager.Instance.levels = data.levels;
        CanvasManager.Instance.health = data.health;
        CanvasManager.Instance.scores = data.scores;
        CanvasManager.Instance.DataUpdate();
    }
}

PlayerPrefs

Playerprefs 是 Unity 提供的一个用于本地数据持久化保存和读取的类

原理就是利用 Key - Value 的方式将数据保存到本地(跟字典类似),然后通过代码实现数据保存、读取和更新的操作

* PlayerPrefs 只能保存 int 型、float 型和 string 型的数据,对于 bool 类型可以用 1/0 代替 真/假,实现保存的目的 *

// 数据存储:PlayerPrefs
    private void SaveByPlayerPrefs()
    {
        PlayerPrefs.SetInt("Levels", CanvasManager.Instance.levels);
        PlayerPrefs.SetInt("Health", CanvasManager.Instance.health);
        PlayerPrefs.SetInt("Scores", CanvasManager.Instance.scores);
        PlayerPrefs.Save();
    }

    // 数据读取:PlayerPrefs
    private void LoadByPlayerPrefs()
    {
        if (PlayerPrefs.HasKey("Levels") && PlayerPrefs.HasKey("Health") && PlayerPrefs.HasKey("Scores"))
        {
            CanvasManager.Instance.levels = PlayerPrefs.GetInt("Levels");
            CanvasManager.Instance.health = PlayerPrefs.GetInt("Health");
            CanvasManager.Instance.scores = PlayerPrefs.GetInt("Scores");
            CanvasManager.Instance.DataUpdate();
        }
        else
            Debug.Log("- 未找到相应数据 -");
    }

通过 PlayerPrefs 中的 SetInt() 将面板上的数据通过键值对的形式进行存储;然后通过 GetInt() 去读取保存下来的值

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
    public void SaveGameData()
    {
        SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
    }

    // 加载游戏数据
    public void LoadGameData()
    {
        LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
    }

序列化与反序列化

保存的时候:

首先创建二进制格式化程序,然后创建文件流,通过格式化程序将 Data 进行序列化并保存到本地

读取的时候:

先创建二进制格式化程序,然后创建文件流,通过格式化程序将 Data 反序列化出来,然后重新设置数据

// 数据存储:二进制方法
    private void SaveByBin()
    {
        try
        {
            Data data = GetGameData();
            // 创建二进制格式化程序
            BinaryFormatter bf = new BinaryFormatter();
            using (FileStream fs = File.Create(Application.dataPath + "/SaveFiles" + "/ByBin.Txt"))
            {
                // 将 data 序列化
                bf.Serialize(fs, data);
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e.Message);
        }
    }

    // 数据读取:二进制方法
    private void LoadByBin()
    {
        try
        {
            BinaryFormatter bf = new BinaryFormatter();
            using (FileStream fs = File.Open(Application.dataPath + "/SaveFiles" + "/ByBin.Txt", FileMode.Open))
            {
                // 将 data 反序列化
                Data data = (Data)bf.Deserialize(fs);
                SetGameData(data);
            }
        }
        catch (System.Exception e)
        {
            Debug.Log(e.Message);
        }
    }

* 文件流创建使用后需要及时关闭,即 fs.Close() *

在这里使用 using 指令的话就会自动关闭,省略了一步关闭的步骤

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
    public void SaveGameData()
    {
        //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
        SaveByBin(); //通过二进制方式
    }

    // 加载游戏数据
    public void LoadGameData()
    {
        //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
        LoadByBin(); //通过二进制方式读取
    }

保存成功后可以在 SaveFiles 文件夹中看到一个 ByBin.txt 文件

Json

json 是一种轻量级的数据交换格式,使用 Json 在 Unity 中实现数据的存储和读取是非常方便的

* 需要导入使用 Json 所需要的插件 *

// 数据存储:Json
    private void SaveByJson()
    {
        Data data = GetGameData();
        string dataPath = Application.dataPath + "/SaveFiles" + "/ByJson.json";
        // 利用 JsonMapper 将 data 转换成字符串
        string dataStr = JsonMapper.ToJson(data);
        // 创建写入流写入数据
        StreamWriter sw = new StreamWriter(dataPath);
        sw.Write(dataStr);
        // 关闭流
        sw.Close();
    }

    // 数据读取:Json
    private void LoadByJson()
    {
        string dataPath = Application.dataPath + "/SaveFiles" + "/ByJson.json";
        // 判断路径文件
        if (File.Exists(dataPath))
        {
            // 创建读取流读取数据
            StreamReader sr = new StreamReader(dataPath);
            string jsonStr = sr.ReadToEnd();
            sr.Close();
            // 使用 JsonMapper 将得到的 jsonStr 转换为 data 对象
            Data data = JsonMapper.ToObject<Data>(jsonStr);
            SetGameData(data);
        }
        else
            Debug.Log("- 未找到相应文件 -");
    }

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
    public void SaveGameData()
    {
        //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
        //SaveByBin(); //通过二进制方式存储
        SaveByJson(); // 通过 Json 方式存储
    }

    // 加载游戏数据
    public void LoadGameData()
    {
        //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
        //LoadByBin(); //通过二进制方式读取
        LoadByJson(); //通过 Json 方式读取
    }

保存成功后可以在 SaveFiles 文件夹中看到一个 json 文件

相较于上一种方法,Json 数据的可读性要好很多

XML

XML 相较于 Json 来说可读性比较好,但文件庞大,格式复杂,没有 Json 简约

// 数据存储:Xml
    private void SaveByXml()
    {
        Data data = GetGameDate();
        string dataPath = Application.dataPath + "/SaveFiles" + "/ByXml.txt";
        // 创建 Xml 文档
        XmlDocument xmlDoc = new XmlDocument();
        // 创建根节点并设置名称
        XmlElement root = xmlDoc.CreateElement("SaveByXml");
        root.SetAttribute("name", "savefile");
        // 创建其他节点并设置值
        XmlElement levels = xmlDoc.CreateElement("levels");
        levels.InnerText = data.levels.ToString();
        XmlElement health = xmlDoc.CreateElement("health");
        health.InnerText = data.health.ToString();
        XmlElement scores = xmlDoc.CreateElement("scores");
        scores.InnerText = data.scores.ToString();
        // 将子节点加入根节点,并将根节点加入 Xml 文档
        root.AppendChild(levels);
        root.AppendChild(health);
        root.AppendChild(scores);
        xmlDoc.AppendChild(root);
        xmlDoc.Save(dataPath);
    }

    // 数据读取:Xml
    private void LoadByXml()
    {
        string dataPath = Application.dataPath + "/SaveFiles" + "/ByXml.txt";
        if (File.Exists(dataPath))
        {
            Data data = new Data();
            XmlDocument xmlDoc = new XmlDocument();
            // 加载指定路径的 Xml 文档
            xmlDoc.Load(dataPath);
            // 通过名字得到相对应的值
            XmlNodeList levels = xmlDoc.GetElementsByTagName("levels");
            data.levels = int.Parse(levels[0].InnerText);
            XmlNodeList health = xmlDoc.GetElementsByTagName("health");
            data.health = int.Parse(health[0].InnerText);
            XmlNodeList scores = xmlDoc.GetElementsByTagName("scores");
            data.scores = int.Parse(scores[0].InnerText);
            SetGameDate(data);
        }
        else
            Debug.Log("- 未找到相应文件 -");
    }

面板上保存数据和加载数据按钮执行的方法

// 保存游戏数据
    public void SaveGameData()
    {
        //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存
        //SaveByBin(); //通过二进制方式存储
        //SaveByJson(); //通过 Json 方式存储
        SaveByXml(); //通过 Xml 方式存储
    }

    // 加载游戏数据
    public void LoadGameData()
    {
        //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取
        //LoadByBin(); //通过二进制方式读取
        //LoadByJson(); //通过 Json 方式读取
        LoadByXml(); //通过 Xml 方式读取
    }

保存成功后可以在 SaveFiles 文件夹中看到一个 txt 文件

以上就是使用这四种方法在 Unity 中实现数据存储和读取方法的案例内容

到此这篇关于Unity 数据存储和读取的方法的文章就介绍到这了,更多相关Unity 数据存储和读取内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Unity存储游戏数据的多种方法小结

    目录 1 PlayerPrefs: Unity自带的一种简单的键值存储系统 2 ScriptableObject: Unity中最灵活的数据管理工具 2.1 如何手动创建和修改数据文件 2.2 ScriptableObject优缺点总结 3 JSON: 轻量级的数据交换格式 3.1 序列化与反序列化 3.2 用JsonUtility对对象进行序列化和反序列化 4 XML:一种可扩展标记语言 5 三者特点总结 6 数据库:存储大量数据时使用的一种方法 1.安装SQLite插件 2.创建数据库和表

  • Unity游戏之存储数据

    在许多游戏中当我们因为一些问题无法接着进行游玩,我们都会选择保存,以便后面有空时,接着游玩.接下来,我们会学习一些Unity有关的存储方法. 一.Unity-PlayerPrefs(数据持久化) 这是Unity自带的用于本地持久化保存与读取的类,采用的是键值对的方式来进行存储,一般通过键名来进行获取.PlayerPrefs有Int,float,string类型. 保存数据 PlayerPrefs.SetString("Color", color); PlayerPrefs.SetInt

  • Unity 数据存储和读取的方法汇总

    目录 数据场景 PlayerPrefs 序列化与反序列化 Json XML 在 Unity 中实现对游戏数据存储和读取的方法主要有这几种: 使用本地持久化类 PlayerPrefs 使用二进制的方法序列化和反序列化(Serialize / Deserialize) 使用 Json 方法 使用 XML 方法 数据场景 在 Demo 中分别使用这四种方法实现面板上数据的存储和读取 创建一个 Data 脚本用来序列化和反序列化,需要向这个类中添加需要保存的数据,最后也是需要从这个类中读取保存的数据 需

  • 对numpy中二进制格式的数据存储与读取方法详解

    使用save可以实现对numpy数据的磁盘存储,存储的方式是二进制.查看使用说明,说明专门提到了是未经压缩的二进制形式.存储后的数据可以进行加载或者读取,通过使用load方法. In [81]:np.save('demo',data1) 通过以上操作,数据data1被存储到了demo文件中,numpy会自动加上npy的文件后缀名. In [82]: a =np.load('demo.npy') In [83]: a Out[83]: array([0,1, 2, 3, 4, 5, 6, 7, 8

  • mysql 5.7更改数据库的数据存储位置的解决方法

    随着MySQL数据库存储的数据逐渐变大,已经将原来的存储数据的空间占满了,导致mysql已经链接不上了.因此,必须要给存放的数据换个地方了.下面是操作过程中的一些步骤.记下来,以后日后查看. 1.修改mysql数据存放的目录 要修改两个地方,其一是修改/etc/my.cnf文件中的datadir.默认情况下: datadir=/var/lib/mysql 因为我的/data/目录比较大,所以将其改为: datadir=/data/mysql/ 还要修改/etc/init.d/mysqld文件,将

  • Mysql 切换数据存储目录的实现方法

    Mysql 切换数据存储目录的实现方法 今日,工作中遇到,mysql,存储所在分区空间都已使用完,导致mysql无法正常启动,为此只能迁移数据存储目录. 1.将现有的数据存储目录,转移到别的存储空间,今日转移时 50G的数据文件,拷贝了 30多分钟,有些慢. 2.修改my.cf配置文件 修改 存储目录 [mysqld] datadir=/home/mysql socket=/home/mysql/mysql.sock [mysql_safe] pid-file=/home/mysql/mysql

  • Spring Security将用户数据存储到数据库的方法

    一.UserDetailService Spring Security 支持多种不同的数据源,这些不同的数据源最终都将被封装成 UserDetailsService 的实例,在微人事(https://github.com/lenve/vhr)项目中,我们是自己来创建一个类实现 UserDetailsService 接口,除了自己封装,我们也可以使用系统默认提供的 UserDetailsService 实例,例如上篇文章和大家介绍的 InMemoryUserDetailsManager . 我们来

  • 利用Python将list列表写入文件并读取的方法汇总

    目录 1.writelines()直接写入 2.str转化为字符串写入 3.for循环写入 4.使用.join函数修改列表 读取数据 附:还有写csv文件和excel文件的方式 总结 1.writelines()直接写入 l=["A","B","C","D"] f=open("k.txt","w") f.writelines(l) f.close() 该方法写入直接写入列表元素 2.st

  • Java读取文件方法汇总

    本文实例为大家分享了Java读取文件的方法,供大家参考,具体内容如下 1.按字节读取文件内容 2.按字符读取文件内容 3.按行读取文件内容 4.随机读取文件内容 public class ReadFromFile { /** * 以字节为单位读取文件,常用于读二进制文件,如图片.声音.影像等文件. */ public static void readFileByBytes(String fileName) { File file = new File(fileName); InputStream

  • python pickle存储、读取大数据量列表、字典数据的方法

    先给大家介绍下python pickle存储.读取大数据量列表.字典的数据 针对于数据量比较大的列表.字典,可以采用将其加工为数据包来调用,减小文件大小 #列表 #存储 list1 = [123,'xiaopingguo',54,[90,78]] list_file = open('list1.pickle','wb') pickle.dump(list1,list_file) list_file.close() #读取 list_file = open('list1.pickle','rb')

  • numpy中以文本的方式存储以及读取数据方法

    Numpy中除了能够把数据以二进制文件的方式保存到文件中以外,还可以选择把数据保存到文本文件中.如果我有磁盘存储的需要,我一般会选择文本的存储,因为后期的处理工具会有更多的选择. 文本存储数据文件可以采用savetxt的功能,而相应文件的加载可以采用loadtxt的功能.与二进制存储不同,savetxt的功能不会自动追加扩展名. 接下来做简单的操作练习示范: In [15]: arr1 =rand(5,4) In [16]: arr1 Out[16]: array([[0.21349492, 0

  • 在localStorage中存储对象数组并读取的方法

    频繁ajax请求导致页面响应变慢.于是考虑将数据存储在window.storage中,这样只请求一次ajax,而不需要频繁请求. 鉴于localstorage中只能存储字符串,所以我们要借助于JSON.stringify()和JSON.parse(); $.ajax({ type: "get", async: "true", url: "", data: {}, dataType: "jsonp", success: func

随机推荐