Unity常见的三种数据本地持久化方案
做游戏的时候常常会有数据配置或者存读档的需求,本文整理了常用的几种解决方案,分别是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常见的三种数据本地持久化方案的更多相关文章
- 常见的三种Web服务架构
常见的三种Web服务架构 转自http://www.cnblogs.com/bvbook/archive/2008/12/24/1360942.html 相互竞争的服务架构 The Competing ...
- 缓慢变化维 (Slowly Changing Dimension) 常见的三种类型及原型设计(转)
开篇介绍 在从 OLTP 业务数据库向 DW 数据仓库抽取数据的过程中,特别是第一次导入之后的每一次增量抽取往往会遇到这样的问题:业务数据库中的一些数据发生了更改,到底要不要将这些变化也反映到数据仓库 ...
- 浅谈Hibernate中的三种数据状态
Hibernate中的三种数据状态:临时.持久.游离 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 数据库中没有数据与之对应,超过作用域会被JVM垃圾回收器 ...
- MySQL - 常见的三种数据库存储引擎
原文:MySQL - 常见的三种数据库存储引擎 数据库存储引擎:是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧. ...
- Excel应该这么玩——5、三种数据:Excel也是系统
Excel最常用的功能就是记录数据,把数据按照行列记录下来.这部分数据是源数据,是业务活动中最原始的流水账,作为后续操作的依据.为了从源数据中得出一定的结论,需要对源数据进行分析得出报表数据. ...
- JSON三种数据解析方法(转)
原 JSON三种数据解析方法 2018年01月15日 13:05:01 zhoujiang2012 阅读数:7896 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...
- Hibernate中的三种数据状态
Hibernate中的三种数据状态(临时.持久.游离) 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 比如:刚刚使用new关键字创建出的对象. 2.持久态 ...
- Docker 数据管理-三种数据mount方式
可以在Container可写层存储数据,但是有三个缺点: 当Container销毁时,数据不能持久保存. Container的可写层和Container所在的主机紧耦合,不容易将数据移动到其他地方. ...
- iOS应用架构谈 本地持久化方案及动态部署
转载: iOS应用架构谈 本地持久化方案及动态部署 前言 嗯,你们要的大招.跟着这篇文章一起也发布了CTPersistance和CTJSBridge这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...
随机推荐
- 利用Python进行数据分析第六季第七集
翩翩一叶扁舟载不动许多愁https://www.wenjuan.com/s/uMRVrmv/双肩扛起的是数不尽的忧https://www.wenjuan.com/s/uMRVrmv给我一杯酒喝尽人间仇 ...
- docker环境下的Grafana安装
一.参考资源:https://grafana.com/docs/grafana/latest/installation/docker/ 二.过程 1.安装grafana 查看可用image [root ...
- Rocket - debug - TLDebugModuleInner - HARTINFO
https://mp.weixin.qq.com/s/9GjZAax0SZhRqLne16jn-w 简单介绍TLDebugModuleInner中HARTINFO寄存器的实现. 1. HARTINFO ...
- jchdl - GSL实例 - Shifter
https://mp.weixin.qq.com/s/ngQji-xi4FCCbL_2ihUi_A Shifter是移位节点的父类,定义了输入输出线,但是没有定义具体的移位方式,这个留给子类去实现 ...
- 【算法基础】Trie算法
字符串统计 维护一个字符串集合,支持两种操作: “I x”向集合中插入一个字符串x: “Q x”询问一个字符串在集合中出现了多少次. 共有N个操作,输入的字符串总长度不超过 105105,字符串仅包含 ...
- Java实现 蓝桥杯VIP 算法训练 统计字符次数
算法训练 统计字符次数 时间限制:1.0s 内存限制:512.0MB 输入一个字符串(长度在100以内),统计其中数字字符出现的次数. 样例输入 Ab100cd200 样例输出 6 import ja ...
- Java实现 LeetCode 100 相同的树
100. 相同的树 给定两个二叉树,编写一个函数来检验它们是否相同. 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的. 示例 1: 输入: 1 1 / \ / \ 2 3 2 3 [ ...
- 【asp.net core 系列】5 布局页和静态资源
0. 前言 在之前的4篇的内容里,我们较为详细的介绍了路由以及控制器还有视图之间的关系.也就是说,系统如何从用户的HTTP请求解析到控制器里,然后在控制器里处理数据,并返回给视图,在视图中显示出来.这 ...
- 还在用SimpleDateFormat格式化时间?小心经理锤你
还在用SimpleDateFormat格式化时间?小心经理锤你 场景 本来开开心心的周末时光,线上突然就疯狂报错,以为程序炸了,截停日志,发现是就是类似下述一段错误 java.lang.NumberF ...
- dfs算法总结
DFS 深度优先搜索 主要有两种实现方法:栈和递归 什么是DFS?说白了就是一直遍历元素的方式而已,我们可以把它看成是一条小蛇,在每个分叉路口随意选择一条路线走,直到撞到南墙,才会调头返回到上一个分叉 ...