做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是Unity自带的PlayerPrefs类,XML文件和Json文件。

一. PlayerPrefs

这是Unity自带的解决方案,会自动生成文件存储于本地,API简单,封装了繁琐的序列化反序列化过程,但他只支持几种基本数据类型,string、int、float,比较简单的数据存读取功能的话,用这个会比较方便。

示例:

早前做历史最高分数的功能,只用到了Get和Set便能实现,Get的第二个参数表示没有取到的默认值。

    //记录分数
PlayerPrefs.SetInt("lastScore", GameUIController.Instance.score);
PlayerPrefs.SetInt("lastLength", GameUIController.Instance.bodyLength);
if (PlayerPrefs.GetInt("bestScore", 0) < GameUIController.Instance.score)
{
PlayerPrefs.SetInt("bestScore", GameUIController.Instance.score);
PlayerPrefs.SetInt("bestLength", GameUIController.Instance.bodyLength);
}
API非常简单,Get和Set会用就掌握大半了:

二. Json(Newtonsoft)

Json的话就可以存储复杂一点的对象,从而实现游戏的存读档。提供一个Json的格式化校验网址:链接

示例:

这里用到的是Newtonsoft的API,需要下载ddl(官网链接),将下载的包放入Assets任意子目录下,通过引入命名空间using Newtonsoft.Json;即可使用

以下为早前通过Json文档读取UI界面类型的简单案例:

[
{"panelType":"MainMenu",
"path":"UIPanels/MainMenuPanel"}, {"panelType":"Battle",
"path":"UIPanels/BattlePanel"}, {"panelType":"Skill",
"path":"UIPanels/SkillPanel"}, {"panelType":"Knapsack",
"path":"UIPanels/KnapsackPanel"}, {"panelType":"Setting",
"path":"UIPanels/SettingPanel"}, {"panelType":"Task",
"path":"UIPanels/TaskPanel"}
]
    /// <summary>
/// 解析UI界面Json文档
/// </summary>
private void ParseUIPanelJson()
{
panelPathDict = new Dictionary<UIPanelType, string>();
//首先读取Resources文件夹下的Json文档
TextAsset ta = Resources.Load<TextAsset>("UIPanelType");
//解析Json文档,用这个库的好处就是能直接反序列化成对象列表,操作简便
List<UIPanelInfo> infoList = JsonConvert.DeserializeObject<List<UIPanelInfo>>(ta.text);
//存入字典保存
foreach (var info in infoList)
{
panelPathDict.Add(info.panelType, info.path);
}
}

三. XML

XML一样可以存储复杂数据对象,相较于Json优点是可读性良好,但效率较低,适合大量的数据配置

第一步要先写XML模板文件,一个怪物的配置模板示例:(必须写两个一样的结点Excel才能映射)

<?xml version="1.0" encoding="UTF-8"?>
<root>
<item ID="">
<mName></mName>
<resPath></resPath>
<hp></hp>
<ad></ad>
<ap></ap>
<addef></addef>
<apdef></apdef>
<dodge></dodge>
<pierce></pierce>
<critical></critical>
</item>
<item ID="">
<mName></mName>
<resPath></resPath>
<hp></hp>
<ad></ad>
<ap></ap>
<addef></addef>
<apdef></apdef>
<dodge></dodge>
<pierce></pierce>
<critical></critical>
</item>
</root>

第二步:

  • 将模板文件导入Excel

    • 在Excel中打开自定义菜单:文件-选项-自定义功能区-主选项卡,将开发工具添加到主选项卡。
    • 在开发工具面板里:XML-源-XML映射-添加模版文件
    • 选中源面板里的模版,映射到表格里。
  • 在Excel中填充数据
    • 数据所有类型,最终都会转化为字符串类型
  • 从Excel中导出附带数据的xml文件
    • 在开发工具面板里:XML-导出

填充数据后的Excel表格示例:

第三步:将导出的xml文件放入Unity项目的任意Resources文件夹下,进行解析

  • 加载xml文件

    • 使用Unity资源系统加载文件
    TextAsset xml = Resources.Load<TextAsset>(filePath);
    XmlDocument doc = new XmlDocument();
    doc.LoadXml(xml.text);
    • 在C#文件IO接口加载文件
    XmlDocument doc = new XmlDocument();
    doc.Load(@"D:\Dev\info.xml");
  • 解析xml文件

    • 获取根节点下的所有子节点的List:
    XmlNodeList nodeLst = doc.SelectSingleNode("root").ChildNodes;
    • 将某一个节点转化为一个XmlElement:
    XmlElement ele = nodLst[i] as XmlElement;
    • 从XmlElement里获取名称为"ID"的数据:
    string value = ele.GetAttributeNode("ID").InnerText;

    注:数据都是以字符串的形式存储,需要自己转化为对应的数据类型。

    XML部分参考博客:链接

四. 小结

比较简单的数据存储需求(如UI界面的配置)使用Unity自带的PlayerPrefs,简单快捷。

需要存储复杂的数据对象,使用Json和XML,而Json较为轻量级,读取速度较快,适合做游戏的存档读档功能,也可以做数据配置。XML较为重量级,优点是通过Excel配置数据,可读性良好,策划配表方便,适合大量的数据配置需求。

Unity常见的三种数据本地持久化方案的更多相关文章

  1. 常见的三种Web服务架构

    常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...

  2. 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)

    开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...

  3. 浅谈Hibernate中的三种数据状态

    Hibernate中的三种数据状态:临时.持久.游离 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器 ...

  4. MySQL - 常见的三种数据库存储引擎

    原文:MySQL - 常见的三种数据库存储引擎 数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧. ...

  5. Excel应该这么玩——5、三种数据:Excel也是系统

        Excel最常用的功能就是记录数据,把数据按照行列记录下来.这部分数据是源数据,是业务活动中最原始的流水账,作为后续操作的依据.为了从源数据中得出一定的结论,需要对源数据进行分析得出报表数据. ...

  6. JSON三种数据解析方法(转)

    原 JSON三种数据解析方法 2018年01月15日 13:05:01 zhoujiang2012 阅读数:7896    版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

  7. Hibernate中的三种数据状态

    Hibernate中的三种数据状态(临时.持久.游离) 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 比如:刚刚使用new关键字创建出的对象. 2.持久态 ...

  8. Docker 数据管理-三种数据mount方式

    可以在Container可写层存储数据,但是有三个缺点: 当Container销毁时,数据不能持久保存. Container的可写层和Container所在的主机紧耦合,不容易将数据移动到其他地方. ...

  9. iOS应用架构谈 本地持久化方案及动态部署

    转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...

随机推荐

  1. python脚本:在Ubuntu16系统上基于xtrabackup2.4和mysql5.7实现数据库数据的自动化备份和恢复,亲测有效!

    1 安装教程 官网安装教程:https://www.percona.com/doc/percona-xtrabackup/2.4/installation/apt_repo.html -------- ...

  2. pycharm关联git

    一.先创建SSH Key 给github设置SSH-KEY !!! 这一步算是连接GitHub的最基本的一步了,git是分布式的代码管理工具,远程的代码管理是基于ssh的,所以得先配好SSH key. ...

  3. Redis 入门到分布式 (四) 瑞士军刀Redis其他功能

    个人博客网:https://wushaopei.github.io/    (你想要这里多有) 目录: 慢查询 Pipeline 发布订阅 Bitmap(位图) HyperLogLog GEO 一.慢 ...

  4. 【大厂面试03期】MySQL是怎么解决幻读问题的?

    问题分析 首先幻读是什么? 根据MySQL文档上面的定义 The so-called phantom problem occurs within a transaction when the same ...

  5. Java实现 蓝桥杯 算法提高 歌唱比赛(暴力)

    试题 算法提高 歌唱比赛 问题描述 X市正在进行歌唱比赛,请你写一个程序计算得分. 每名选手从1到N编号,每名选手的综合成绩由以下几个部分组成: 1.歌唱得分占70% 2.才艺展示得分占20% 3.观 ...

  6. Java实现 LeetCode 507 完美数

    507. 完美数 对于一个 正整数,如果它和除了它自身以外的所有正因子之和相等,我们称它为"完美数". 给定一个 整数 n, 如果他是完美数,返回 True,否则返回 False ...

  7. Java实现 LeetCode 434 字符串中的单词数

    434. 字符串中的单词数 统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符. 请注意,你可以假定字符串里不包括任何不可打印的字符. 示例: 输入: "Hello, my nam ...

  8. Java实现 LeetCode 319 灯泡开关

    319. 灯泡开关 初始时有 n 个灯泡关闭. 第 1 轮,你打开所有的灯泡. 第 2 轮,每两个灯泡你关闭一次. 第 3 轮,每三个灯泡切换一次开关(如果关闭则开启,如果开启则关闭).第 i 轮,每 ...

  9. java实现复制网站内容

    复制网站内容 复制代码 本程序将网站"www.baidu.com"首页的内容复制保存在文件test.html中.写了如下代码,请完善之: import java.net.*; im ...

  10. Linux ACL权限查看与设定

    getfacl 文件名,可以查看文件的acl权限 setfacl [选项] 文件名,可以设定文件的acl权限,例如:setfacl -m u:boduo:rx /project/ 这时候,创建了bod ...