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这两个库,希望大家在实际使用的时候如果遇到问题,就给 ...
随机推荐
- vue-cli4 + TS构建新项目
1. 如果你之前没有安装vue-cli,可以通过如下命令进行安装: npm install -g @vue/cli yarn global add @vue/cli 2. 创建vue项目 vue cr ...
- ASP.NET实现一个在线音乐统计网站(歌手,音乐,角色……增删改查)
这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 当前步骤是该项目的完结部分(前面由于没有时间整理了,直接发一个大完结吧) 第一部分 第二部分 源码已上传GitHub:这里有 ...
- Java实现 洛谷 P1060 开心的金明
题目描述 金明今天很开心,家里购置的新房就要领钥匙了,新房里有一间他自己专用的很宽敞的房间.更让他高兴的是,妈妈昨天对他说:"你的房间需要购买哪些物品,怎么布置,你说了算,只要不超过NN元钱 ...
- Java实现 LeetCode 733 图像渲染(DFS)
733. 图像渲染 有一幅以二维整数数组表示的图画,每一个整数表示该图画的像素值大小,数值在 0 到 65535 之间. 给你一个坐标 (sr, sc) 表示图像渲染开始的像素值(行 ,列)和一个新的 ...
- Java实现 LeetCode 553 最优除法(思路问题)
553. 最优除法 给定一组正整数,相邻的整数之间将会进行浮点除法操作.例如, [2,3,4] -> 2 / 3 / 4 . 但是,你可以在任意位置添加任意数目的括号,来改变算数的优先级.你需要 ...
- Java实现 LeetCode 502 IPO(LeetCode:我疯起来连自己都卖)
502. IPO 假设 力扣(LeetCode)即将开始其 IPO.为了以更高的价格将股票卖给风险投资公司,力扣 希望在 IPO 之前开展一些项目以增加其资本. 由于资源有限,它只能在 IPO 之前完 ...
- Java实现 LeetCode 300 最长上升子序列
300. 最长上升子序列 给定一个无序的整数数组,找到其中最长上升子序列的长度. 示例: 输入: [10,9,2,5,3,7,101,18] 输出: 4 解释: 最长的上升子序列是 [2,3,7,10 ...
- Java实现 LeetCode 67 二进制求和
67. 二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 输入为非空字符串且只包含数字 1 和 0. 示例 1: 输入: a = "11", b = "1 ...
- Java实现第九届蓝桥杯复数幂
复数幂 题目描述 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. 求 (2+3i)^123456 等于多少? 即(2+3i)的123456次幂,这个数字很大,要求精确表示. ...
- Navicat 连接远程服务器端MySQL
Navicat是一个很好的操作各种数据库的图形化工具,我用它在本地连接过MySQL.SQL Server.SQLite,用它操作数据库确实非常方便.快捷,再搭配SQL语句,是一个很好的选择了. 废话不 ...