保存和加载
介绍
注意:保存系统目前处于测试阶段,以便从社区获取反馈。随着我们改进设计,未来更新中可能会有重大变化。
真菌保存系统提供了一种简单的方法来保存和加载游戏中流程图的执行状态。
本教程视频展示了如何快速向 Fungus 游戏添加保存功能。
保存系统的工作方式是,玩家在游戏过程中存储一系列保存点,以建立保存历史记录。系统提供了基本的保存菜单 UI,允许玩家通过保存历史记录进行保存、加载、重启、倒回和快进。
通过在流程图中执行“保存点”命令来创建保存点。当稍后重新加载保存点时,执行会从此“保存点”命令之后立即恢复。保存系统负责恢复每个保存点处流程图变量的状态,并且当某个保存点已通过“保存点已加载”事件处理程序加载时,您还可以收到通知。
如果您使用旧命令来保存单个变量(设置保存配置文件、保存变量、加载变量),它们仍然有效,但它们与这个新的保存系统是分开的。
保存游戏示例场景
要了解保存系统的工作原理,请打开示例场景FungusExamples/Savegame/SaveGame.unity
在 Unity 中按下播放按钮,然后点击短篇故事。点击右上角的小齿轮图标,即可随时访问保存菜单。在玩游戏的过程中,尝试在不同时间点保存、加载、倒带、快进和重新开始。还可以尝试在故事中间保存游戏并停止游戏。再次按下播放按钮,您会注意到游戏会从您上次中断的地方继续。
保存菜单还支持自动保存模式,游戏在每个保存点都会保存到磁盘。您可以通过选择保存菜单对象并选择自动保存属性来启用此功能。使用自动保存时,保存和加载按钮将被禁用。
以下是在此示例场景中用于实现保存的关键元素。
保存菜单 UI
保存菜单对象位于层次结构窗口的根目录中。此对象控制玩家用于与保存系统交互的 UI 菜单。保存菜单是一个在场景加载期间持续存在的单例对象,因此您只需要在游戏的第一个场景中添加一次即可。
要向您的游戏添加“保存菜单”,请选择“工具”>“真菌”>“创建”>“保存菜单”。
创建保存点
保存点是通过执行流程图中的保存点命令来创建的。
要在示例场景中看到这一点,请确保显示流程图窗口(通过工具 > 真菌 > 流程图窗口),然后在层次结构窗口中选择流程图对象并选择流程图中的每个块。每个块中的第一个命令是保存点命令(通过流程 > 保存点添加)。
当每个“保存点”命令执行时,它会将新的“保存点”添加到“保存历史记录”中。当您加载之前保存的游戏时,执行会立即从创建该保存点的“保存点”命令之后恢复。
在示例场景中,选择流程图窗口中的“开始”块,然后选择命令列表顶部的保存点命令。请注意,“是起点”属性已启用,并且这是流程图中唯一启用此选项的保存点命令。一个场景中应该只有一个起点。
当您开始新游戏时,Fungus 会查找启用了“是起点”属性的“保存点”命令并执行该命令。加载之前保存的游戏时,Fungus 会从相关的“保存点”命令开始执行,并忽略起点。
这意味着如果您的游戏支持保存,那么您应该始终在每个场景中启用一个带有“起点”属性的“保存点”命令。
注意:游戏开始事件处理程序将针对新游戏和加载的游戏触发,这通常不是您想要的,因此请避免在支持保存的游戏中使用它。
处理保存点加载事件
当保存的游戏加载时,您通常需要做一些额外的工作来确保场景处于正确的状态。例如,可能需要将相机移动到适当的位置或此时播放游戏中的一个特定音乐曲目。一种简单的方法是通过 Save Point Loaded 事件处理程序。
在示例场景中,选择流程图中的“播放音乐 1”块,并查看它是否具有保存点已加载事件处理程序。当保存点键列表中的任何保存点加载时,这将执行该块。在这种情况下,我们只需为游戏的这一部分播放正确的音乐,但您可以在此处进行任何所需的设置。
当匹配的“保存点已加载”命令执行时,也会触发“保存点已加载”事件处理程序(如果启用了“触发事件”属性)。这样,您可以将所有场景设置命令放入一个共享块中,当首次到达“保存点”命令或在该保存点加载先前保存的游戏时,将调用该块。
保存流程图变量
每个保存点都可以存储该时间点的流程图变量的状态。您可以使用保存数据对象让保存系统知道哪些流程图将包含在其中。请注意,目前只保存布尔、整数、浮点和字符串变量。
在示例场景中,可以在层次结构窗口的根目录中看到 Save Data 对象。Flowcharts 属性包含要在此场景中保存的 Flowchart 对象的列表。
要将“保存数据”对象添加到场景中,请选择“工具”>“真菌”>“创建”>“保存数据”。您可以将任意数量的流程图添加到列表中,但请确保每个流程图都有唯一的名称(例如“流程图1”、“流程图2”等),否则加载将无法正常进行。
如果您有兴趣扩展保存系统以支持保存其他类型的数据(除了流程图变量),您可以修改或子类化 SaveData 组件来实现这一点。
保存菜单
保存菜单是一个简单的用户界面,允许玩家与 Fungus 保存系统交互。本节介绍每个按钮的功能以及如何配置保存菜单属性。
保存菜单属性
您可能需要在保存菜单中配置 4 个主要属性。
- 保存数据键:用于在 Player Prefs 中存储保存游戏数据的字符串键。如果您在同一个 Unity 项目中定义了多个游戏,请为每个游戏使用一个唯一的键。
- 启动时加载:启动时自动加载之前保存的游戏。
- 自动保存:在每个保存点自动将游戏保存到磁盘。启用此选项后,保存和加载按钮将被禁用。
- 重启删除保存:当玩家重启游戏时,从磁盘中删除保存数据。这在测试游戏时很有用,可确保您从空白保存状态开始。
注意:如果您的游戏使用多个场景(例如通过加载场景命令),请确保将所有场景添加到构建设置中的构建场景列表中。
保存按钮
按下“保存”按钮会导致当前保存历史记录序列化为 JSON 文本并通过 PlayerPrefs 类写入持久存储。
加载按钮
按下“加载”按钮会导致之前存储的 JSON 数据被反序列化并用于填充保存历史记录。然后使用最近的保存点按以下顺序恢复游戏状态。
- 加载存储在保存点的场景(即使它是当前加载的场景)。
- 将流程图变量恢复为保存的值
- 调用保存点已加载事件处理程序并在适当的保存点命令后启动流程图执行。
倒带和快进按钮
使用“倒带”和“快进”按钮可以在保存历史记录中的保存点之间前后移动。
每次移动只会加载保存历史中特定时间点的保存点。这本身不会更改保存历史或将任何内容写入持久存储。但是,如果您倒退到较早的保存点并重新开始游戏,则下次执行保存点命令时,将导致所有更早的保存点被永久丢弃。
重启按钮
重启按钮会清除保存历史并加载开始场景。开始场景是保存菜单首次初始化时处于活动状态的场景。
游戏启动
请记住,玩家可以随时选择加载或重新开始游戏。遵循这些简单的规则可确保在任何情况下都能正确处理游戏启动。
- 游戏中的每个场景都应只有一个“保存点”命令,并且启用“是起始点”属性。如果游戏中有多个场景,请确保每个场景都定义了起始保存点,并且它是场景中执行的第一个命令。
- 避免使用“游戏开始”事件处理程序。这仅在第一次玩游戏时才能正常工作,在加载已保存的游戏后则无法正常工作。加载已保存的游戏后,您希望执行从保存点开始,而不是再次从流程图的开头开始。
- 当您想要在加载特定保存点时执行块时,请使用“保存点已加载”事件处理程序。这些事件处理程序在执行“保存点”命令恢复之前调用,因此它让您有机会在游戏恢复之前进行设置工作。
术语
保存点
保存点是游戏在某一时间点的状态快照。每个保存点记录当前场景、流程图执行的当前点(即保存点命令)以及流程图变量的当前值。目前仅保存布尔、整数、浮点和字符串变量。
保存点命令
保存点命令用于在流程图中创建执行中的保存点。每个单独的保存点命令都应具有唯一的保存点键。加载时恢复选项使执行在加载保存点后从此点恢复。
保存点密钥
保存点键是单个保存点的唯一字符串标识符。默认情况下,父块的名称用于保存点键,但如果需要,您也可以使用自定义键(例如单个块中的多个保存点命令)。
注意:每个场景的每个密钥必须是唯一的,否则加载将无法正确进行!
保存历史记录
保存历史记录包含按时间顺序存储的先前记录的保存点列表。执行保存点命令时,将创建一个新的保存点并附加到保存历史记录中。
要在运行时可视化保存历史记录,请在层次结构中展开“保存菜单”对象,选择“保存菜单”>“面板”>“调试视图”并启用游戏对象。保存历史记录中的保存点摘要将显示在文本窗口中。