前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Unity 数据存储和读取的案例分享

Unity 数据存储和读取的案例分享

原创
作者头像
用户7718188
发布2022-11-06 20:13:47
7690
发布2022-11-06 20:13:47
举报
文章被收录于专栏:高级工程司高级工程司

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

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

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

1

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

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

2

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 代替 真/假,实现保存的目的 *

3

// 数据存储: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() 去读取保存下来的值

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

4

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

序列化与反序列化

保存的时候:

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

读取的时候:

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

5

// 数据存储:二进制方法    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 指令的话就会自动关闭,省略了一步关闭的步骤

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

6

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

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

Json

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

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

7

// 数据存储: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("- 未找到相应文件 -");    }

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

8

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

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

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

XML

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

9

// 数据存储: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("- 未找到相应文件 -");    }

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

10

// 保存游戏数据    public void SaveGameData()    {        //SaveByPlayerPrefs(); //通过 PlayerPrefs 方式保存        //SaveByBin(); //通过二进制方式存储        //SaveByJson(); //通过 Json 方式存储        SaveByXml(); //通过 Xml 方式存储    }     // 加载游戏数据    public void LoadGameData()    {        //LoadByPlayerPrefs(); //通过 PlayerPrefs 方式读取        //LoadByBin(); //通过二进制方式读取        //LoadByJson(); //通过 Json 方式读取        LoadByXml(); //通过 Xml 方式读取    }

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

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

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • PlayerPrefs
  • 序列化与反序列化
  • Json
  • XML
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档