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

news2025/2/23 4:30:06

🎯 目标:

✅ 掌握 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 受伤后自动存档

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2299272.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flutter 异步编程利器:Future 与 Stream 深度解析

目录 一、Future&#xff1a;处理单次异步操作 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Future 3.2 使用 then 消费 Future 3.3 特性 二、Stream&#xff1a;处理连续异步事件流 1. 概念解读 2. 使用场景 3. 基本用法 3.1 创建 Stream 3.2 监听 Stream 3.…

Java短信验证功能简单使用

注册登录阿里云官网&#xff1a;https://www.aliyun.com/ 搜索短信服务 自己一步步申请就可以了 开发文档&#xff1a; https://next.api.aliyun.com/api-tools/sdk/Dysmsapi?version2017-05-25&languagejava-tea&tabprimer-doc 1.引入依赖 <dependency>…

React进阶之React核心源码解析(一)

React核心源码解析 react 特点CPU卡顿IO 卡顿 新老 react 架构对比v15v16.8Scheduler 调度器Reconciler 协调器 React fiber原理更新dommount 构建过程 render阶段 — scheduler reconcilerreact源码解析react-domreact-dom/src/client/ReactDOMRoot.js react-reconcilerreact-…

【Vue】打包vue3+vite项目发布到github page的完整过程

文章目录 第一步&#xff1a;打包第二步&#xff1a;github仓库设置第三步&#xff1a;安装插件gh-pages第四步&#xff1a;两个配置第五步&#xff1a;上传github其他问题1. 路由2.待补充 参考文章&#xff1a; 环境&#xff1a; vue3vite windows11&#xff08;使用终端即可&…

类加载机制及双亲委派模型

一、引言 二、类加载流程 1. 加载 2. 连接 2.1 验证 2.2 准备 2.3 解析 3. 初始化 三、类加载器 类加载器的类型 双亲委派模型 打破双亲委派模型 双亲委派模型优点 一、引言 在 Java 的运行机制中&#xff0c;类加载是一个至关重要的环节。它不仅决定了 Java 程序的动态…

尚硅谷课程【笔记】——大数据之Hadoop【一】

课程视频链接&#xff1a;尚硅谷Hadoop3.x教程 一、大数据概论 1&#xff09;大数据概念 大数据&#xff08;Big Data&#xff09;&#xff1a;指无法再一定时间范围内用常规软件工具进行捕捉、管理和处理的数据集合&#xff0c;是需要新处理模式才能具有更强的决策力、洞察发…

DockerFile优化镜像体积

title: DockerFile优化镜像体积 date: 2025-02-15 15:22:40 tags: DockerFile优化镜像体积DockerFile优化镜像体积 DockerFile优化镜像体积前文回顾:一、细数优化镜像体积的思路与方式二、优化Dockfile文件编辑 Dockerfile2文件三、构建镜像四、运行镜像五、查看运行效果原文 …

题解:洛谷 P4113 [HEOI2012] 采花

题目https://www.luogu.com.cn/problem/P4113 运用类似于P1972 [SDOI2009] HH的项链的操作&#xff0c;将数据离线下来处理。 按照区间右端点从小到大排序。 问题是数量大于等于 的时候才能算进去。 于是乎我们用两个数组维护倒数第二次出现和最后一次出现的地方。 每次在…

easyexcel快速使用

1.easyexcel EasyExcel是一个基于ava的简单、省内存的读写Excel的开源项目。在尽可能节约内存的情况下支持读写百M的Excel 即通过java完成对excel的读写操作&#xff0c; 上传下载 2.easyexcel写操作 把java类中的对象写入到excel表格中 步骤 1.引入依赖 <depen…

android studio下载安装汉化-Flutter安装

1、下载android studio官方地址&#xff1a;&#xff08;这个网址可能直接打不开&#xff0c;需要VPN&#xff09; https://developer.android.com/studio?hlzh-cn mac版本分为X86和arm版本&#xff0c;电脑显示芯片是Inter的就是x86的&#xff0c;显示m1和m2的就是arm的 …

Seaweedfs(master volume filer) docker run参数帮助文档

文章目录 进入容器后执行获取weed -h英文中文 weed server -h英文中文 weed volume -h英文中文 关键点测试了一下&#xff0c;这个-volume.minFreeSpace string有点狠&#xff0c;比如设置值为10&#xff08;10%&#xff09;&#xff0c;它直接给系统只留下10%的空间&#xff0…

【工业安全】-CVE-2022-35555- Tenda W6路由器 命令注入漏洞

文章目录 1.漏洞描述 2.环境搭建 3.漏洞复现 4.漏洞分析 4.1&#xff1a;代码分析  4.2&#xff1a;流量分析 5.poc代码&#xff1a; 1.漏洞描述 漏洞编号&#xff1a;CVE-2022-35555 漏洞名称&#xff1a;Tenda W6 命令注入 威胁等级&#xff1a;高危 漏洞详情&#xff1…

C#(Winform)通过添加AForge添加并使用系统摄像机

先展示效果 AForge介绍 AForge是一个专门为开发者和研究者基于C#框架设计的, 也是NET平台下的开源计算机视觉和人工智能库 它提供了许多常用的图像处理和视频处理算法、机器学习和神经网络模型&#xff0c;并且具有高效、易用、稳定等特点。 AForge主要包括: 计算机视觉与人…

【LeetCode: 611. 有效三角形的个数 + 排序 + 双指针】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

每日十题八股-补充材料-2025年2月15日

1.TCP是如何保证消息的顺序和可靠的&#xff1f; 写得超级好的文章 首先肯定是三次握手和四次挥手保证里通讯双方建立了正确有效的连接。 其次是校验和、序列号&#xff0c;ACK消息应答机制还有重传机制&#xff0c;保证了消息顺序和可靠。 同时配合拥塞机制和流量控制机制&am…

国内已经部署DeepSeek的第三方推荐

大家好&#xff0c;我是苍何。 最近DeepSeek爆火&#xff0c;我也说点心里话&#xff0c;其实就我们普通人而言&#xff0c;要想用好 DeepSeek&#xff0c;其实无非就是要利用好工具为我们自己提效。 比如你是搞编程的&#xff0c;你就得学会如何用 DeepSeek 更快速的辅助你编…

Windows环境下使用Ollama搭建本地AI大模型教程

注&#xff1a;Ollama仅支持Windows10及以上版本。 安装Ollama 去 ollama官网 下载对应平台及OS的安装包。 运行安装包&#xff0c;点击“安装”按钮即可开始安装。Ollama会自动安装到你的 C:\Users\<当前用户名>\AppData\Local\Programs\Ollama 目录上。 安装完成后&…

2024年认证杯SPSSPRO杯数学建模A题(第二阶段)保暖纤维的保暖能力全过程文档及程序

2024年认证杯SPSSPRO杯数学建模 A题 保暖纤维的保暖能力 原题再现&#xff1a; 冬装最重要的作用是保暖&#xff0c;也就是阻挡温暖的人体与寒冷环境之间的热量传递。人们在不同款式的棉衣中会填充保暖材料&#xff0c;从古已有之的棉花、羽绒到近年来各种各样的人造纤维。不…

算法19(力扣244)反转字符串

1、问题 编写一个函数&#xff0c;其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。 不要给另外的数组分配额外的空间&#xff0c;你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。 2、示例 &#xff08;1&#xff09; 示例 1&a…

DeepSeek 助力 Vue 开发:打造丝滑的卡片(Card)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…