UNREAL如何在本地设备中永久存储玩家的游戏进度数据?
Unreal Engine本地永久存储游戏数据实现方案
首选方案:UE原生SaveGame系统
这是UE官方提供的轻量级本地存档方案,无需引入第三方依赖,适合新手快速实现需求。
步骤1:创建自定义SaveGame类
- 在内容浏览器右键,选择蓝图类,搜索
SaveGame作为父类,将新建的类命名为MySaveGame - 打开
MySaveGame蓝图,新增两个可编辑的整数变量:PlayerCurrency:存储玩家累计游戏内货币数量CompletedLevelCount:存储玩家已完成的关卡数量
步骤2:编写数据存储逻辑
在玩家获得货币、完成关卡等需要更新存档的节点调用存储逻辑即可:
蓝图实现:
- 调用
Create Save Game Object节点,选择你创建的MySaveGame类作为目标类- 给返回的SaveGame实例的
PlayerCurrency、CompletedLevelCount变量赋值为当前游戏内的最新数值- 调用
Save Game to Slot节点,自定义存储槽名称(比如PlayerLocalData),用户索引保持默认0即可,节点返回的布尔值可判断是否存储成功
C++实现:
首先引入必要头文件:#include "SaveGame/MySaveGame.h" #include "Kismet/GameplayStatics.h"存储逻辑代码:
UMySaveGame* SaveInstance = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass())); if (IsValid(SaveInstance)) { // 赋值最新的游戏数据 SaveInstance->PlayerCurrency = CurrentPlayerCurrency; SaveInstance->CompletedLevelCount = CurrentCompletedLevelNum; // 写入本地存储 bool bSaveSuccess = UGameplayStatics::SaveGameToSlot(SaveInstance, TEXT("PlayerLocalData"), 0); }
步骤3:编写数据读取逻辑
建议在游戏启动、主菜单加载等节点调用读取逻辑,初始化游戏内变量:
蓝图实现:
- 调用
Load Game from Slot节点,填写之前定义的存储槽名PlayerLocalData,用户索引0- 将返回的通用对象转换为
MySaveGame类型,转换成功即可读取两个变量的数值,赋值给游戏内对应的全局变量- 如果读取失败(一般是玩家首次启动游戏还未生成存档),直接将两个变量初始化为0即可
C++实现:
UMySaveGame* LoadedInstance = Cast<UMySaveGame>(UGameplayStatics::LoadGameFromSlot(TEXT("PlayerLocalData"), 0)); if (IsValid(LoadedInstance)) { // 读取存档数值赋值给游戏内变量 CurrentPlayerCurrency = LoadedInstance->PlayerCurrency; CurrentCompletedLevelNum = LoadedInstance->CompletedLevelCount; } else { // 首次启动初始化默认值 CurrentPlayerCurrency = 0; CurrentCompletedLevelNum = 0; }
注意事项
- 存储槽名全局唯一即可,不要和其他存档功能的槽名重复
- 原生SaveGame存储的文件默认位于游戏的
Saved/SaveGames目录下,属于用户本地永久数据,除非用户手动删除或卸载游戏时勾选清除本地数据,否则会一直保留 - 如果后续有存档防篡改需求,可以额外加加密逻辑,新手阶段直接使用原生方案即可满足需求
内容的提问来源于stack exchange,提问作者Tom Lightfoot
相关产品推荐
相关产品推荐

