Unityunity3dUNITY3D进阶

Unity进阶技巧 - XML存档与加密

2016-11-21  本文已影响2310人  Zui
数据与加密

前言

不管开发什么游戏,游戏存档是个必不可少的功能,你可能需要保存玩家的一些信息,比如身上穿戴的装备,玩家角色所处的场景等各种信息,对于存档功能(数据持久化),Unity提供了原生技术Playerprefs,它的优点是理解和使用起来十分简单,缺点是对于大型数据存储时会力不从心,所以本文会介绍如何使用XML来实现游戏存档和存档加密的功能。

编程环境

你将学到什么?

整体思路解析

数据存储和加密的主要逻辑思路:

  1. 使用XmlSerializer类对需要保存的数据类进行序列化操作,得到一串字符串。
  2. 将得到的字符串使用RijndaeManaged类和ICrytoTransform类进行加密操作,获得加密之后的字符串。
  3. 根据平台类型,确定文件保存的路径。
  4. 使用StreamWriter类将字符串保存到文件中。

数据加载和解密的主要逻辑思路:

  1. 根据存档文件的路径,使用StreamReader类读取文件中的内容(一串加密过的字符串)。
  2. 使用RijndaeManaged类和ICrytoTransform类对读取的文件内容进行解密操作,获得一串解密后的字符串。
  3. 使用XmlSerializer类对解密后的字符串进行反序列化操作,获得具体的游戏数据,并使用数据对游戏中的数据进行转换操作。

一、准备工作

在实现具体保存操作前,我们需要先实现我们要保存的游戏数据,本文使用一个简化的数据,假设我们保存的数据是MyPlayer类,里面记录着以下信息:

下面我们就来具体实现这些数据,首先我们新建一个Unity工程,工程名字大家可以自定义,然后我们新建一个C#文件,命名为Item,打开item文件,并进行如下编辑:

Item代码

接下来我们再新建一个C#文件,命名为MyPlayer,打开Myplayer文件,并进行如下编辑:

MyPlayer代码

二、实现XmlManager的序列化与写入操作

有了需要存储的数据,下面我们可以来实现如何将数据用XML来序列化,并且将序列化的数据写入到文件中。

首先我们新建一个C#脚本,命名为XmlManager,然后打开脚本进行如下编辑:

XmlManager关于序列化和写入的代码

三、实现GameDataManager保存操作

首先在场景中新增一个空的对象,然后将其命名为DataController,然后在上面挂载一个我们新建的C#脚本GameDataManager

DataController对象与其挂载的脚本

然后我们打开GameDataManager脚本进行如下的编辑:

GameDataManager的保存和获取路径代码

编写上图中的代码后,我们回到Unity编辑器,然后运行,之后我们便会发现Project视窗中多了一个名为ZuiData的文件,如下图:

**Project**视窗中**ZuiData**文件

然后我们打开ZuiData文件,就会发现里面保存着_myPlayer对象的数据,如下图:

ZuiData的文件内容

到此,我们学会了将游戏数据序列化并写入到文件中的操作了。

四、实现XmlManager的反序列化和读取操作

学会了保存数据后,下一步我们就要来实现读取文件数据,并且将其反序列化,成为我们可以使用的对象。

我们再次打开XmlManager脚本,新增以下代码:

XmlManager中的反序列化和读取代码

五、实现GameDataManager的读取数据操作

实现了XmlManager的反序列化和读取操作后,我们就可以在GameDataManager中实现将xml的数据读取,并且把这些数据转换成我们需要使用的类型,比如转换成我们_myPlayer的信息。

接下来,我们打开GameDataManager脚本,并新增以下代码:

GameDataManager的读取和打印代码

制作读取按钮

有了上面这些方法后,为了在实际演示中,让我们可以看到数据的读取后的改变,我们在项目中新建一个按钮,来触发数据读取的操作。

读取数据按钮

我们在项目中新建一个名为“LoadButton”的按钮,然后将其内容改为“读取数据”,然后我们在按钮的点击逻辑上挂载GameDataManager中的pressLoadButton方法,如下图:

挂载pressLoadButton方法到LoadButton上

实现按钮后,我们打开ZuiData文件,将玩家的ID改为99,玩家名字改为“ZuiPlayer”,武器的名称改为“Eagles”,如下图:

修改ZuiData文件内容

修改之后,我们再次打开GameDataManager脚本,把Start方法中的内容全部注释掉,如下图:

注释Start方法中的代码

最后我们回到Unity编辑器,然后运行程序,点击读取数据按钮,然后查看后台打印出来的数据是否与我们修改过后的数据一致,如无意外,效果如下图:

最终效果图

到此,我们学会了XML数据的读取和反序列化。

六、对文件数据进行加密和解密

虽然我们现在学会了使用xml进行数据的存储和读取,但是就想我们上面读取操作时一样,我们可以直接通过改写ZuiData文件里面的内容,从而改变游戏的数据,这样对于游戏数据来说是很不安全的,所以我们最好对游戏最终保存的数据进行一些加密操作,这样就无法通过文件直接修改游戏的数据了。

我们再次打开XmlManager脚本,然后新增以下代码:

XmlManager中加密和解密的代码

完成了这些主要的方法后,我们还需要对XmlManager脚本进行一些小修改,具体见下图:

XmlManager中的小修改

做完这些改动后,我们再把GameDataManager脚本中的Start方法中的代码注释取消掉,让其恢复作用,最后我们回到Unity编辑器,运行程序,可以看到我们save和load操作都是正常运行的,而这个时候我们再次打开ZuiData文件,就会发现文件中的内容变成了一些乱码,这样就无法通过修改存档来改变游戏的数据了。

加密后的ZuiData文件内容

参考阅读

MSDN 关于RijndaelManaged类的说明
MSDN 关于ICryptoTransform类的说明

补充内容

_clothes就不会被序列化
上一篇 下一篇

猜你喜欢

热点阅读