🎯 目标:
✅ 掌握 UE5 SaveGame 存档系统
✅ 在 C++ 创建存档类,存储游戏数据
✅ 实现存档 & 读取功能,让游戏状态可持久化
✅ 在 BP_PlayerCharacter 里实现:
* 游戏开始时自动加载存档
* 玩家受到伤害时自动存档
1️⃣ 为什么需要存档系统?
在游戏开发中,玩家的数据(如 角色血量、位置、游戏进度)需要存储,以便下次进入游戏时恢复。UE5 提供了 USaveGame 存档系统,可以快速存储 & 读取数据。
📌 存档系统的核心逻辑:
- 创建 SaveGame 继承类,定义需要存储的数据
- 游戏开始时加载存档,恢复玩家状态
- 玩家受伤后自动存档,确保游戏数据不会丢失
2️⃣ 创建 SaveGame 存档类
🔹 1. 创建 MySaveGame C++ 类
- 在 UE5,点击 文件 → 新建 C++ 类
- 选择 SaveGame 作为父类
- 命名为 MySaveGame
- 点击 创建 并等待编译完成
🔹 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 里实现:
- SaveGameData() 方法 → 存储玩家数据
- 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 里添加 加载存档
- 打开 BP_PlayerCharacter
- 在 Event Graph 里
- 添加 Event BeginPlay
- 调用 LoadGameData()
📌 最终蓝图逻辑:
✅ 游戏开始时自动加载存档数据!
🔹 2. 在 BP_PlayerCharacter 里添加 受伤自动存档
- 找到 受伤逻辑(如 TakeDamage)
- 在受伤时,调用 SaveGameData()
📌 最终蓝图逻辑:
✅ 每次受伤都会自动保存数据,确保存档始终更新!
🎯 总结
✅ 使用 USaveGame 存储游戏数据(血量 & 位置)
✅ PlayerCharacter 实现 SaveGameData() 和 LoadGameData()
✅ BP_PlayerCharacter 游戏开始时自动加载存档
✅ BP_PlayerCharacter 受伤后自动存档
🎮 现在,你的游戏支持自动存档,玩家可以随时恢复游戏进度!🚀