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


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

    创建SaveGame类

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

    1. UPROPERTY()
    2. int32 SavedLevel;
    3. UPROPERTY()
    4. float SavedCurrentHealth;
    5. UPROPERTY()
    6. float SavedCurrentMana;
    7. UPROPERTY()
    8. float SavedCurrentExp;

     创建两个变量:

    1. /*
    2. * 存储的实例变量
    3. */
    4. UGridShootSG* GridShootSG;
    5. /*
    6. * 存储的插槽名称
    7. */
    8. FString SlotName = "UserInfo";

    存储和加载方法:

    1. /*
    2. * 存储
    3. */
    4. void SaveGame();
    5. /*
    6. * 读取存储的数据
    7. */
    8. void LoadSaveGame();

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

    1. void ABaseCharacter::SaveGame()
    2. {
    3. if (!GridShootSG)
    4. {
    5. GridShootSG = Cast<UGridShootSG>(UGameplayStatics::CreateSaveGameObject(UGridShootSG::StaticClass()));
    6. }
    7. GridShootSG->SavedLevel = Level;
    8. GridShootSG->SavedCurrentHealth = CurrentHealth;
    9. GridShootSG->SavedCurrentMana = CurrentMana;
    10. GridShootSG->SavedCurrentExp = CurrentExp;
    11. UGameplayStatics::SaveGameToSlot(GridShootSG,SlotName,0);
    12. }

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

    1. void ABaseCharacter::LoadSaveGame()
    2. {
    3. if (!GridShootSG)
    4. {
    5. GridShootSG = Cast<UGridShootSG>(UGameplayStatics::LoadGameFromSlot(SlotName,0));
    6. }
    7. Level = GridShootSG->SavedLevel;
    8. CurrentHealth = GridShootSG->SavedCurrentHealth;
    9. CurrentMana = GridShootSG->SavedCurrentMana;
    10. CurrentExp = GridShootSG->SavedCurrentExp;
    11. }

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

    1. void ABaseCharacter::ReadData()
    2. {
    3. //是否存在SaveGame,存在的话就读取SaveGame的数据,否则就读取表格数据
    4. bool IsSavedExist = UGameplayStatics::DoesSaveGameExist(SlotName,0);
    5. if (IsSavedExist)
    6. {
    7. LoadSaveGame();
    8. LoadUserLevelInfoTable();
    9. }
    10. else
    11. {
    12. LoadUserLevelInfoTable();
    13. SaveGame();
    14. }
    15. }

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

    效果如下:

    UE5C++存储和读取效果

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

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

  • 相关阅读:
    【已解决】ubuntu耳机单侧有声音
    [《考驾照》闲笔记事集]2012年8月28日
    怎么在树莓派上搭建web网站,并发布到外网可访问?
    PMP每日一练 | 考试不迷路-11.22(包含敏捷+多选)
    Flink SQL: LOAD Statements
    网课题库API接口 对接教程
    JavaScript 异步函数的 Promisification 处理
    C#上位机开发目录
    IOC操作-bean管理:基于注解的方式来创建对象和(自动装配)属性注入以及完全注解开发方式
    Flink中的批和流
  • 原文地址:https://blog.csdn.net/qq_42597694/article/details/137005997