在Unity中存档机制实现的三种方式
在Unity中搭建一个存档机制,可以借助Unity自带的PlayerPrefs类,或者使用xml及json此类格式化文档。而除此之外,一种更安全、也并不复杂的方式是转化为二进制格式的文件进行存储。
二进制存档机制实现原理
此类方法主要借助一个被称为BinaryFormatter的二进制转换器,先将游戏内的玩家数据转换为二进制数据,再通过文件流写入存档文件。读档则进行相反的操作。
示例的实现过程
为了简化过程,我创建了一个最简单的示例,即只有一个整型游戏数值需要保存的情况。如果需要保存Vector3或Color等复杂的引用类型,需要将其拆为一个一维数组。
创建示例场景
在U3D中新建工程,添加一个Text文本框和三个按钮组件。文本框显示玩家数值。三个按钮组件中,其中两个是用于存档和读档的,另一个单击一次就能使文本框中的数值减一。
场景中新建一个名为Player的空物体,添加脚本Player.cs,代码如下:
1 | using UnityEngine; |
脚本写完后,需要将文本框拖拽赋值给scoreRec变量。
再新建一个脚本Minus.cs,用于手动减小score的值,代码如下:
1 | using UnityEngine; |
将此脚本挂在Main Camera上(或者随便什么地方,只要你觉得方便操作就行),然后将其中的MinusOne函数赋给减一按钮的On Click。
此时运行游戏,文本框将显示100,每单击一次减一的按钮,数值就会变小。准备工作完成。
实现二进制文件存读档
现在新建一个脚本PlayerData.cs。
这个脚本是一个类,方便将所有玩家数据打包。我们的示例只有一个数据,所以无法体现这一点。不过我们还是新建它。代码如下:
1 | [System.Serializable] //可序列化,详细意义可以自行百度,相信你会有所收获 |
之后新建脚本SaveSystem.cs,和PlayerData类一样,它不需要挂在任何物体上,所以也不需要继承自MonoBehaviour。
在这个类中,我们完成新建用于存储数据的文档、打包玩家数据、使用formatter进行序列化的存档操作;以及读取数据存储文档、使用formatter反序列化、将玩家数据返回的读档操作。代码如下:
1 | using UnityEngine; |
现在要做的最后一步就是将SavePlayer函数和LoadPlayer函数赋给两个按钮,使我们可以通过点击来存档、读档。
首先在Player类中加入以下代码:
1 | public void SavePlayer() |
之后将Player拖拽给存档和读档按钮的On Click,并分别选择SavePlayer和LoadPlayer函数。
完成,现在我们运行游戏,例如我们点击减一按钮使数值变成88,点击存档之后,不论是否退出过游戏,再点击读档,都可以使数值重新变成88。