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

第 15 天:数据存储,打造存档 读取系统!

🎯 目标:

✅ 掌握 UE5 SaveGame 存档系统
✅ 在 C++ 创建存档类,存储游戏数据
✅ 实现存档 & 读取功能,让游戏状态可持久化
✅ 在 BP_PlayerCharacter 里实现:
* 游戏开始时自动加载存档
* 玩家受到伤害时自动存档

1️⃣ 为什么需要存档系统?

在游戏开发中,玩家的数据(如 角色血量、位置、游戏进度)需要存储,以便下次进入游戏时恢复。UE5 提供了 USaveGame 存档系统,可以快速存储 & 读取数据

📌 存档系统的核心逻辑:

  1. 创建 SaveGame 继承类,定义需要存储的数据
  2. 游戏开始时加载存档,恢复玩家状态
  3. 玩家受伤后自动存档,确保游戏数据不会丢失

2️⃣ 创建 SaveGame 存档类

🔹 1. 创建 MySaveGame C++ 类

  1. 在 UE5,点击 文件 → 新建 C++ 类
  2. 选择 SaveGame 作为父类
  3. 命名为 MySaveGame
  4. 点击 创建 并等待编译完成

🔹 2. 修改 MySaveGame.h

📌 定义存档数据(如玩家血量 & 位置)

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/SaveGame.h"
#include "MySaveGame.generated.h"

UCLASS()
class MYGAME_API UMySaveGame : public USaveGame
{
    GENERATED_BODY()

public:
    UMySaveGame();

    // 存储玩家血量
    UPROPERTY(VisibleAnywhere, Category = "SaveData")
    float PlayerHealth;

    // 存储玩家位置
    UPROPERTY(VisibleAnywhere, Category = "SaveData")
    FVector PlayerLocation;
};

📌 UPROPERTY(VisibleAnywhere) 让数据可在 蓝图 & 代码 访问,确保存档可用。

🔹 3. 修改 MySaveGame.cpp

📌 初始化存档数据

#include "MySaveGame.h"

UMySaveGame::UMySaveGame()
{
    PlayerHealth = 100.0f; // 默认血量
    PlayerLocation = FVector::ZeroVector; // 默认位置
}

✅ 现在 MySaveGame 存档类已准备好,接下来我们来实现存档 & 读取功能!

3️⃣ 实现存档 & 读取功能

在 PlayerCharacter 里实现:

  1. SaveGameData() 方法 → 存储玩家数据
  2. LoadGameData() 方法 → 读取玩家数据

🔹 1. 修改 PlayerCharacter.h

📌 添加存档 & 读取方法

UFUNCTION(BlueprintCallable, Category = "SaveSystem")
void SaveGameData();

UFUNCTION(BlueprintCallable, Category = "SaveSystem")
void LoadGameData();

🔹 2. 修改 PlayerCharacter.cpp

📌 实现 SaveGameData()

#include "PlayerCharacter.h"
#include "Kismet/GameplayStatics.h"
#include "MySaveGame.h"

void APlayerCharacter::SaveGameData()
{
    // 创建存档对象
    UMySaveGame* SaveGameInstance = Cast<UMySaveGame>(UGameplayStatics::CreateSaveGameObject(UMySaveGame::StaticClass()));

    // 设置存档数据
    SaveGameInstance->PlayerHealth = Health;
    SaveGameInstance->PlayerLocation = GetActorLocation();

    // 保存到文件
    UGameplayStatics::SaveGameToSlot(SaveGameInstance, TEXT("PlayerSaveSlot"), 0);

    UE_LOG(LogTemp, Warning, TEXT("游戏存档完成!"));
}

📌 实现 LoadGameData()

void APlayerCharacter::LoadGameData()
{
    // 检查存档是否存在
    if (UGameplayStatics::DoesSaveGameExist(TEXT("PlayerSaveSlot"), 0))
    {
        // 加载存档
        UMySaveGame* LoadedGame = Cast<UMySaveGame>(UGameplayStatics::LoadGameFromSlot(TEXT("PlayerSaveSlot"), 0));

        if (LoadedGame)
        {
            // 恢复数据
            Health = LoadedGame->PlayerHealth;
            SetActorLocation(LoadedGame->PlayerLocation);

            UE_LOG(LogTemp, Warning, TEXT("游戏存档已加载!"));
        }
    }
    else
    {
        UE_LOG(LogTemp, Warning, TEXT("没有找到存档文件"));
    }
}

✅ 现在 SaveGameData() 和 LoadGameData() 方法已经准备好,下一步在 BP_PlayerCharacter 里使用它们!

4️⃣ 在 BP_PlayerCharacter 中自动加载 & 存储存档

我们将在 BP_PlayerCharacter 蓝图中:

  • 游戏开始时自动加载存档
  • 玩家受伤后自动存档

🔹 1. 在 BP_PlayerCharacter 里添加 加载存档

  1. 打开 BP_PlayerCharacter
  2. 在 Event Graph 里
    • 添加 Event BeginPlay
    • 调用 LoadGameData()
      📌 最终蓝图逻辑:
      在这里插入图片描述

✅ 游戏开始时自动加载存档数据!

🔹 2. 在 BP_PlayerCharacter 里添加 受伤自动存档

  1. 找到 受伤逻辑(如 TakeDamage)
  2. 在受伤时,调用 SaveGameData()
    📌 最终蓝图逻辑:
    在这里插入图片描述

✅ 每次受伤都会自动保存数据,确保存档始终更新!

🎯 总结

✅ 使用 USaveGame 存储游戏数据(血量 & 位置)
✅ PlayerCharacter 实现 SaveGameData() 和 LoadGameData()
✅ BP_PlayerCharacter 游戏开始时自动加载存档
✅ BP_PlayerCharacter 受伤后自动存档

🎮 现在,你的游戏支持自动存档,玩家可以随时恢复游戏进度!🚀

相关文章:

  • CAD字体 SHX字体下载
  • Lineageos 22.1(Android 15)更换开机动画
  • Python函数进阶250215
  • 百度智能云—千帆 ModelBuilder API的简单调用(Java)
  • 《AI大模型开发笔记》MoE模型技术对比(Mixtral,Qwen2-MoE,DeepSeek-v3)
  • 刷机维修进阶教程-----MTK芯片机型修改脚本 永久去除系统更新 无视bl锁 无需root权限
  • tcp/ip协议设置参数,tcp/ip协议6设置
  • Linux文件管理:硬链接与软链接
  • 架构——Nginx功能、职责、原理、配置示例、应用场景
  • AF3 from_pdb_string和from_mmcif_string函数解读
  • 麻将对对碰游戏:规则与模拟实现
  • 【Unity3D】Jenkins Pipeline流水线自动构建Apk
  • 深入剖析 Vue 的响应式原理:构建高效 Web 应用的基石
  • HTML4
  • 记使用AScript自动化操作ios苹果手机
  • C语言中的常量与只读变量,#define与const的区别
  • CUDA-计算内存事务的次数
  • Xmind 2024安装教程超详细(小白零基础入门)图文教程【附安装包】
  • ffmpeg学习:ubuntu下编译Android版ffmpeg-kit
  • Windows搭建CUDA大模型Docker环境
  • 春秋航空:如果供应链持续改善、油价回落到合理水平,公司补充运力的需求将会增长
  • “降息潮”延续!存款利率全面迈向“1时代”
  • 长三角地区中华老字号品牌景气指数发布,哪些牌子是你熟悉的?
  • 视频|漫画家寂地:古老丝路上的文化与交流留下的独特印记
  • 王耀庆化身“罗朱”说书人,一人挑战15个角色
  • 巴基斯坦军方称印度袭击已致26死46伤