Unity中常见的四种存读方式

简述

本文就Unity常见的四种存读数据的方式进行总结和分析,分别是:
PlayerPrefs,二进制序列化,JSON,XML 四种方式
这里个人比较喜欢PlayerPrefsJSON,因为对于我们目前的开发情况而言,它们是最方便且实用的
下面先在开篇小结一下四种方式的特点,想看详情的话可以跳过这一部分,直接到 四种情况的实现与分析

PlayerPrefs

通过键值对进行存读
是一种特殊的Caching System 缓存系统,它可以在不同的场景之间,有效地保存一些简单的设置和变量
比如说音乐、音效的开关等等,简单的设置。其实它的名字就很明了:它更适合保存一些选项设置与简单的变量

prefs 就是 preferences 的简称啊,“玩家首选项”已经很明显的表明了它是用来干什么的

比如游戏选项的设置、图片、事关用户核心的简单的变量等等
如果你只是想保存玩家生命值,分数等的、简单记录的数值,它也可以胜任。
如果你想进一步保存怪物状态,物品,成就系统什么的,建议还是看下面的内容

二进制序列化

代码量少
二进制的可读性很差
不过…这也使作弊者直接修改存档变得困难一些
兼容性差
总之就是比PlayerPrefs强一点,代码量也可以接受的多一些
但是和JSON相比,它的可读性太差了,而JSON的代码量和实现难度并不会比它难

JSON

同样也是使用键值对的保存方式,本质就是记录数据的一长串字符串
代码量较XML相比并不多,解析难度也比XML简单
它所谓的包括String,int,float/double,数组,对象类,bool
值得一提的是,它不支持集合(比如字典) ,但是它支持List
传输速度快,占用空间小,在网页中和JS也能更好地交互
扩展性不如XML,但是相比之下写JSON的难度也比写XML简单

XML

可以将大量的信息通过XML元素的形式存储在xmlDocument中
但是解析的时候不得不考虑元素间的关系,而且加载的时候还要通过标签名来找到它们的集合
拥有太多重复的冗余信息————占用空间最大,解析它的时间和资源也更多
个人认为,写起来的时候从各个角度来说都是非常麻烦的。
再加上JSON配合插件可以自动整理,好像XML的扩展性和可读性的优势并不明显

四种情况的实现与分析

布局

首先利用让一个脚本来管理存读系统,也就是把存读的相关方法写进去即可
这里(为了偷懒)就写在之前控制菜单的脚本里面了(这里仅表示一下我写了)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
if(Input.GetKeyDown(KeyCode.B)){
//存档
Debug.Log("进行存档");
//SaveData_PlayerPrefs();
//SaveBySerialization();
//SaveByJson();
SaveByXML();
}

if(Input.GetKeyDown(KeyCode.N)){
//存档
Debug.Log("进行读档");
//LoadData_PlayerPrefs();
//LoadbySerialization();
//LoadByJson();
//LoadByXML();
}

PlayerPrefs

首先是PlayerPrefs,最简单的键值存储,它可以存读整型、浮点、字符串的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
//存储整型数据
PlayerPrefs.SetInt("intKey",999);
//存储浮点型数据
PlayerPrefs.SetFloat("floatKey",1.11f);
//存储字符串数据
PlayerPrefs.SetString("strKey","I am Plane");

//取出key为"intKey"的整型数据
int intVal = PlayerPrefs.GetInt("intKey");
//取出key为"floatKey"的浮点型数据
float floatVal = PlayerPrefs.GetFloat("floatKey");
//获取key为"strKey"的字符串数据
string strVal = PlayerPrefs.GetString("strKey");

以及一些其它操作

1
2
3
4
5
6
//删除所有存储数据
PlayerPrefs.DeleteAll();
//删除key为"score"的数据
PlayerPrefs.DeleteKey("score");
//查找是否存在key为"score"的数据
bool exist = PlayerPrefs.HasKey("score")

Save对象