当前位置: 首页 > news >正文

UE5C++学习(四)--- SaveGame类存储和加载数据

上一篇说到使用数据表读取数据,如果我开始玩游戏之后,被怪物打了失去了一部分血量,这个时候我想退出游戏,当我再次进入的时候,希望仍然保持被怪物打之后的血量,而不是重新读取了数据表,这个时候就需要使用SaveGame类去存储和加载数据。注:SaveGame类的存储是放在本地的。

创建SaveGame类

 这里继续使用上一篇中的UserInfo,添加需要保存的数据:

    UPROPERTY()int32 SavedLevel;UPROPERTY()float SavedCurrentHealth;UPROPERTY()float SavedCurrentMana;UPROPERTY()float SavedCurrentExp;

 创建两个变量:

    /** 存储的实例变量*/UGridShootSG* GridShootSG;/** 存储的插槽名称*/FString SlotName = "UserInfo";

存储和加载方法:

    /** 存储*/void SaveGame();/** 读取存储的数据*/void LoadSaveGame();

 如果SG变量不存在,那么就去创建一个存储的Object,再去赋值,并使用SaveGameToSlot存储;

void ABaseCharacter::SaveGame()
{if (!GridShootSG){GridShootSG = Cast<UGridShootSG>(UGameplayStatics::CreateSaveGameObject(UGridShootSG::StaticClass()));}GridShootSG->SavedLevel = Level;GridShootSG->SavedCurrentHealth = CurrentHealth;GridShootSG->SavedCurrentMana = CurrentMana;GridShootSG->SavedCurrentExp = CurrentExp;UGameplayStatics::SaveGameToSlot(GridShootSG,SlotName,0);
}

 加载方法,SG如果不存在,就先去读取,再进行赋值。

void ABaseCharacter::LoadSaveGame()
{if (!GridShootSG){GridShootSG = Cast<UGridShootSG>(UGameplayStatics::LoadGameFromSlot(SlotName,0));}Level = GridShootSG->SavedLevel;CurrentHealth = GridShootSG->SavedCurrentHealth;CurrentMana = GridShootSG->SavedCurrentMana;CurrentExp = GridShootSG->SavedCurrentExp;
}

在一开始读取数据的时候,去进行判断

void ABaseCharacter::ReadData()
{//是否存在SaveGame,存在的话就读取SaveGame的数据,否则就读取表格数据bool IsSavedExist = UGameplayStatics::DoesSaveGameExist(SlotName,0);if (IsSavedExist){LoadSaveGame();LoadUserLevelInfoTable();}else{LoadUserLevelInfoTable();SaveGame();}
}

这样的话就能看到一个效果,一开始没有存储之前,是去读取数据表,血量是满的,在这里我在角色被攻击的时候去存储一下,当我退出之后,再去进入游戏,就是被攻击之后的血量。

效果如下:

UE5C++存储和读取效果

当存储成功之后,在项目路径下就可以看到存储的文件

注意该文件不要以记事本或者其他编辑工具打开,因为该文件是二进制文件,用其他方式打开会毁坏文件。

相关文章:

  • Sql Server小技能:row_number()函数
  • 【Vue】Vue集成Element-UI框架
  • 深圳区块链交易所app系统开发,撮合交易系统开发
  • 服务器总是宕机问题记录
  • 【WPF应用7】 基本控件-Grid 布局的详解与示例
  • 如何在Linux系统使用Docker本地部署Halo网站并实现无公网IP远程访问
  • Python读取csv文件入Oracle数据库
  • vivado 使用远程主机和计算群集
  • 接招吧! selenium环境+元素定位大法
  • TCP重传机制详解——03DSACK
  • jvm高级面试题-2024
  • 如何在Appium中使用AI定位
  • yarn安装包时报错error Error: certificate has expired
  • IDEA2023版本整合SpringBoot热部署
  • GEE训练——如何实现单景影像边界的提取以sentinel和Landsat数据为例(栅格转矢量)
  • 【跃迁之路】【444天】程序员高效学习方法论探索系列(实验阶段201-2018.04.25)...
  • JavaScript新鲜事·第5期
  • leetcode378. Kth Smallest Element in a Sorted Matrix
  • php中curl和soap方式请求服务超时问题
  • Rancher-k8s加速安装文档
  • Vue UI框架库开发介绍
  • 产品三维模型在线预览
  • 成为一名优秀的Developer的书单
  • 从tcpdump抓包看TCP/IP协议
  • 复习Javascript专题(四):js中的深浅拷贝
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 回流、重绘及其优化
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 无服务器化是企业 IT 架构的未来吗?
  • 想写好前端,先练好内功
  • 一道闭包题引发的思考
  • 因为阿里,他们成了“杭漂”
  • 自动记录MySQL慢查询快照脚本
  • ​ArcGIS Pro 如何批量删除字段
  • # Panda3d 碰撞检测系统介绍
  • # 达梦数据库知识点
  • (31)对象的克隆
  • (4)STL算法之比较
  • (TOJ2804)Even? Odd?
  • (附源码)python房屋租赁管理系统 毕业设计 745613
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (一)基于IDEA的JAVA基础12
  • (转)Google的Objective-C编码规范
  • ***监测系统的构建(chkrootkit )
  • .naturalWidth 和naturalHeight属性,
  • .NET CF命令行调试器MDbg入门(一)
  • .net core 调用c dll_用C++生成一个简单的DLL文件VS2008
  • .net core开源商城系统源码,支持可视化布局小程序
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .Net Remoting(分离服务程序实现) - Part.3
  • .Net各种迷惑命名解释
  • @data注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [android] 手机卫士黑名单功能(ListView优化)
  • [Angular 基础] - 自定义指令,深入学习 directive
  • [EMWIN]FRAMEWIN 与 WINDOW 的使用注意