Unity基础教程系列(六)——更多的游戏状态(Saving All That Matters)

这篇教程详细介绍了如何在Unity游戏中保存随机状态和关卡数据,包括如何追踪和恢复随机序列,持久化关卡数据,以及如何在加载游戏时选择是否重新生成随机种子。此外,还讨论了如何保存和加载关卡状态,包括序列化复合生成区域和旋转对象,确保游戏状态的一致性。
摘要由CSDN通过智能技术生成

目录

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值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值