Bootstrap

UE游戏保存/加载存档功能

函数名功能
Create Save Game Object创建保存游戏对象
Does Save Game Exist检查存档是否存在
Load Game from Slot加载存档
Save Game to Slot保存存档
Delete Game in Slot删除存档
Async Save Game To Slot异步保存存档

Slot Name 是插槽名字
存档都是通过插槽名字来 读取/加载/检查/删除的

先创建一个SaveGame类 , 这个类里可以存放要保存的数据 , 比如 玩家的位置 / 名字 / 金钱 / 经验 等 ,所有基本数据类型都是可以保存的,数组集合映射类型,结构体都可以保存,引用类型的变量不能保存
基本数据类型
SaveGame父类
在这里插入图片描述
打开BP_Save

这里我就保存玩家的位置
保存玩家的位置
我们再创建一个控件蓝图 , 画个界面
在这里插入图片描述

然后到第三人称蓝图 先搞个BeginPlay 默认加载存档 (可以根据自己 游戏玩法/业务需求 写)

(2025.1.7回来补充:这里要写在GameInstance里才对!)
在这里插入图片描述

游戏开始时候先检查 有没有存档 , 如果有存档就加载存档 设置玩家存档的位置 , 如果没有存档就创建一个空白对象和位置变量 , 然后保存存档 , 接着加载这个存档

然后回到控件蓝图 , 写三个按钮的控件逻辑
开始游戏就清空存档 , 重新打开一个新关卡
保存存档先检查插槽是否存在 , 如果存在就获取位置保存存档
加载存档也是一样 , 检查完直接设置角色存档位置就行了
在这里插入图片描述

然后再回到第三人称蓝图
按下Tab键 召唤界面 , 再按下界面就消失

在这里插入图片描述

需要注意: save game to slot 节点调用后,如果在没打包之前会在项目文件本地建立SaveGames文件夹下保存.sav。 在项目打包完以后并不会存储在相应的.exe目录下,系统默认存储在C盘。 这就意味着我们的应用的存档再copy到其他电脑的时候会丢失存档
在这里插入图片描述
,不过我们可以通过修改c++更改默认存储路径。

Async Save Game To Slot| 异步保存存档 可防止突然的帧率卡顿,让玩家不容易注意到

2025.1.7补充:

如果从一个关卡到另一个关卡,要保存关卡数据,就要把数据存在GameInstance里,GameInstance的数据也是存在内存中的,随进程结束而消失
GameInstence解释:
关于 GameInstance 存储关卡数据
GameInstance 是 UE(Unreal Engine)中的一个类,它在整个游戏运行期间存在,并且可以在不同的关卡之间共享数据。当需要保存关卡数据并在关卡切换后继续使用这些数据时,使用 GameInstance 是一个不错的选择。例如,玩家在一个关卡中的角色属性(如生命值、经验值)或者游戏进度相关的数据(如已完成的任务列表)可以存储在 GameInstance 中。这样,当玩家进入下一个关卡时,这些数据依然可以被访问和使用。
数据存储在内存中的特点
数据存储在内存中的好处是读写速度相对较快。当数据存储在 GameInstance 中时,游戏可以快速地获取和修改这些数据,以实现游戏逻辑。然而,正如你所说,这种存储在内存中的数据是临时性的。当游戏进程结束时,内存中的数据会随之消失。这是因为内存是一种易失性存储介质,它需要持续的电力供应来维持数据的存储状态。一旦游戏进程终止,操作系统会回收游戏所占用的内存空间,存储在其中的数据也就丢失了。
如果想要长期保存游戏数据,例如玩家希望下次打开游戏时能够继续从上次离开的地方开始,就需要将数据存储到非易失性存储介质中,如硬盘等。可以通过文件系统将数据序列化(例如将数据结构转换为可以存储的字节流)并保存到本地文件中,或者使用数据库等方式来实现持久化存储。

如果是网络游戏,那数据就是保存在服务器数据库中了,暂时还没研究。。。以后学会了在这里补充~

更多可参考官方文档:
https://dev.epicgames.com/documentation/zh-cn/unreal-engine/saving-and-loading-your-game-in-unreal-engine

;