上一篇说到使用数据表读取数据,如果我开始玩游戏之后,被怪物打了失去了一部分血量,这个时候我想退出游戏,当我再次进入的时候,希望仍然保持被怪物打之后的血量,而不是重新读取了数据表,这个时候就需要使用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++存储和读取效果
当存储成功之后,在项目路径下就可以看到存储的文件

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