目录 |
1 保存随机性 1.1 记录随机状态 1.2 读取随机状态 1.3 JSON序列化 1.4 解耦关卡 1.5 两种方式都支持 2 持久化关卡数据 2.2 存储游戏关卡 2.3 加载关卡数据 2.4 缓冲数据 3 关卡状态 3.1 序列化符合生成区 3.2 记住下一个索引 3.3 追踪持久对象 3.4 为新游戏重新加载 3.5 旋转对象 4 创建和释放 4.1 保存和加载 4.2 确切时间 4.3 速度设置 4.4 更新文本标签 |
本文重点:
1、追踪随机性
2、保存关卡数据
3、在生成区做循环
4、创建旋转的关卡对象
这是关于对象管理的系列教程中的第六篇。除了生成形状和关卡索引之外,它还包括保存更多游戏状态。
本教程使用Unity 2017.4.4f1编写。
(可重复生成的随机形状)
1 保存随机性
当生成形状时使用随机性的重点是会得到不可预知的结果,但这不一定是我们想要的。假设你先保存了游戏,又再生成了一些形状。然后,再次加载游戏并重新生成刚才一样多的形状。那么你会得到完全相同的形状呢,还是不同的呢?就目前而言,你会得到不同的。但如果想让两次生成的形状完全一致,我们也是可以支持的。
由Unity的随机方法生成的数字并不是真正随机的,是伪随机。它是由数学公式生成的一串数字。在游戏开始时,这个序列会根据当前时间用一个任意的种子值初始化。如果你使用相同的种子开始一个新的序列,你将得到完全相同的数字。
1.1 记录随机状态
只存储初始种子值是不够的,因为这将把我们带回到序列的开始,而不是游戏被保存时序列中的点。但是Random必须跟踪它在序列中的位置。如果我们能到达这个状态,那么我们可以稍后恢复它,以继续旧的序列。
随机状态定义为一个状态结构,嵌套在随机类中。所以我们可以声明Random.State这种类型的字段或参数。为了保存它,我们必须向GameDataWriter添加一个可以写入这样一个值的方法。现在添加这个方法,但将它的实现留到之后。
通过这种方法,我们可以保存游戏的随机状态。让我们在Game.Save一开始的时就做这个操作。然后,在写下形状计数后立即保存。同样,增加保存版本号以表示新的格式。
1.2 读取随机状态
若要读取随机状态,请向GameDataReader添加ReadRandomState方法。由于我们尚未编写任何内容,因此暂时不阅读任何内容。取而代之,我们返回当前的随机状态,因此,实际上没有任何变化。当前状态可以通过静态Random.state属性找到。
随机状态的设置是通过相同的属性完成的,我们会在Game.Load中做,但仅用于保存文件版本为3或更高的时候。
1.3 JSON序列化
Random.State包含四个浮点数。但是,它们不能公开访问,因此我们不可能简单地写入它们。必须使用一些间接方法。
幸运的是,Random.State是可序列化的类型,因此可以使用Unity的JsonUtility类的ToJson方法将其转换为相同数据的字符串表示形式。我们会得到一个JSON字符串。要查看它的内容的话,请将其记录到控制台。
Json是什么意思?
正确的拼写是JSON,所有字母均为大写。它代表JavaScript对象表示法。它定义了一种简单的人类可读数据格式。
保存游戏后,控制台现在将在大括号之间记录一个字符串,该字符串包含四个从s0到s3的数字。类似于{“ s0”:-1409360059,“ s1”:1814992068,“ s2”:-772955632,“ s3”:1503742856}。
我们将此字符串写入文件。如果使用文本编辑器打开保存的文件的话,则可以在文件开头附近看到此字符串。
同样,在ReadRandomState中,通过调用ReadString读取此字符串,然后使用JsonUtility.FromJson将其转换回适当的随机状态。
除了数据之外,FromJson还需要知道应该从JSON数据创建的何种类型。我们可以使用该方法的通用版本,指定应创建一个Random.State值。