108. UE5 GAS RPG 实现地图名称更新和加载关卡

news2024/12/29 1:35:31

在这一篇里,我们将实现对存档的删除功能,在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置,我们可以通过存档进入游戏,玩家在游戏中可以在存档点存储存档。

实现删除存档

删除存档需要一个弹框确认,防止玩家误操作,所以,我们需要一个弹框的用户控件。
创建一个新的蓝图,基于我们之前自定义的用户空间基类。
在这里插入图片描述
然后添加对应的UI,外层添加覆层是为了保证动态创建添加到视口时,位置正确,尺寸框内的组件为组成弹框的内容。
在这里插入图片描述
里面比较注意的点一个是边框的设置,我们需要将其设置为边界,然后调整边缘。
在这里插入图片描述
我增加了一个背景模糊,保证玩家注意点只关注到弹框。
在覆层这里,我们将事件修改为可视,这样,鼠标事件将不会传递到后面的ui上,将不会参数误触的问题
在这里插入图片描述
下面为制作完成的效果。
在这里插入图片描述
接下来,我们为弹框取消按钮和确认按钮绑定点击事件。

在取消时,我们只需要清除自身即可
在这里插入图片描述
在确认时,我们通过一个事件分发器,外部可以绑定事件分发器的回调,来绑定触发确认后的回调
在这里插入图片描述

增加删除功能

我们在GameMode里增加一个删除存档的函数,用于删除已经存在的存档

	/**
	 * 删除存档
	 * @param SlotName 需要删除存档对应的视图模型实例名称
	 * @param SlotIndex 存档索引
	 */
	static void DeleteSlotData(const FString& SlotName, int32 SlotIndex);

实现就是通过函数获取存档,存在就删除即可。

void ARPGGameMode::DeleteSlotData(const FString& SlotName, const int32 SlotIndex)
{
	//检查是否有对应名称的存档
	if(UGameplayStatics::DoesSaveGameExist(SlotName, SlotIndex))
	{
		//删除已保存的存档
		UGameplayStatics::DeleteGameInSlot(SlotName, SlotIndex);
	}
}

接着,我们在加载界面的视图模型里增加一个删除存档事件,用于用户控件蓝图调用

	/**
	 * 删除存档
	 * @param Slot 点击存档的位置,以索引来代表
	 */
	UFUNCTION(BlueprintCallable)
	void DeleteButtonPressed(int32 Slot);

在实现这里,通过调用GameMode里的事件删除,然后修改显示用户控件枚举,更新对应存档UI显示的用户控件。

void UMVVM_LoadScreen::DeleteButtonPressed(const int32 Slot)
{
	//删除存档
	const ARPGGameMode* RPGGameMode = Cast<ARPGGameMode>(UGameplayStatics::GetGameMode(this));
	RPGGameMode->DeleteSlotData(LoadSlots[Slot]->GetSlotName(), Slot);

	//修改用户控件显示
	LoadSlots[Slot]->LoadSlotStatus = Vacant; //修改为创建存档
	LoadSlots[Slot]->InitializeSlot(); //修改存档显示
}

接着,我们在对应的存档用户控件里增加一个按钮,用于删除存档。
在这里插入图片描述
在蓝图初始化回调里,我们绑定删除按钮的点击事件,创建一个弹框来添加到视口,并监听事件分发器的事件,如果在弹框选择了确认,将触发删除事件,我们使用添加到加载界面的视图模型的删除函数删除即可。
在这里插入图片描述

实现地图名称更新

在创建新存档这里,我们需要实现读取到地图的名称,并且地图名称需要是可以自定义的。
首先,我们修改加载界面使用的GameMode的父类,让其基础战斗场景使用的蓝图类,这样,它也会继承类里设置的数据,我们只需要在父类上设置,子类上也会成为默认值。
在这里插入图片描述
接着,我们将一些不必要的类设置恢复到之前状态,战斗场景使用的,不必要在加载界面使用。
在这里插入图片描述
接着,我们在c++里在GameMode类里增加一些配置,用于配置初始进入的地图和地图名称,并增加一个映射,可以增加多个地图。
这里映射使用了TSoftObjectPtr,这个指针只保存路径,如果不使用,对应的资源不会加载到场景,可以在需要时再加载。

	//初始地图名称
	UPROPERTY(EditDefaultsOnly)
	FString DefaultMapName;

	//游戏初始地图
	UPROPERTY(EditDefaultsOnly)
	TSoftObjectPtr<UWorld> DefaultMap;

	//地图名称和地图的映射
	UPROPERTY(EditDefaultsOnly)
	TMap<FString, TSoftObjectPtr<UWorld>> Maps;

然后覆写BeginPlay函数,在BeginPlay里将初始地图加入到映射

protected:
	virtual void BeginPlay() override;
void ARPGGameMode::BeginPlay()
{
	Super::BeginPlay();

	Maps.Add(DefaultMapName, DefaultMap);
}

然后增加一个函数,用于进入对应地图

void TravelToMap(const UMVVM_LoadSlot* Slot);

我们通过UGameplayStatics::OpenLevelBySoftObjectPtr加载软引用的地图,它在未使用时不会加载,所以在打开时,会出现卡顿。

void ARPGGameMode::TravelToMap(const UMVVM_LoadSlot* Slot)
{
	const FString SlotName = Slot->GetSlotName();
	const int32 SlotIndex = Slot->SlotIndex;
	
	//打开地图
	UGameplayStatics::OpenLevelBySoftObjectPtr(Slot, Maps.FindChecked(Slot->GetMapName()));
}

接着打开蓝图,我们设置初始的地图和名称。
在这里插入图片描述
接着,我们需要在用户控件上让其自动更新名称,在存档的视图模型上增加对地图名称的相关设置
在这里插入代码片
接着在加载界面视图模型里在创建存档时设置,
在这里插入图片描述
在获取存档后,记得设置存档用户控件使用的视图模型的地图名称。
在这里插入图片描述
存档视图模型可以获取到数据,我们接着增加一个函数,用于进入游戏的事件调用,用于打开新关卡。

void UMVVM_LoadScreen::EnterGameButtonPressed(const int32 Slot)
{
	ARPGGameMode* RPGGameMode = Cast<ARPGGameMode>(UGameplayStatics::GetGameMode(this));
	RPGGameMode->TravelToMap(LoadSlots[Slot]);
}

最后,我们在显示存档的用户控件里绑定地图名称的显示
在这里插入图片描述
并绑定加载进度的点击回调,调用进入关卡事件,并测试即可。
在这里插入图片描述
在这里插入图片描述

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

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

相关文章

DNS批量解析管理软件有什么用

在复杂的网络环境中&#xff0c;DNS批量解析管理软件犹如一把功能强大的钥匙&#xff0c;开启了高效网络管理的大门&#xff0c;为网络运营和维护带来了诸多便利。 1、对于网络服务提供商而言&#xff0c;DNS批量解析管理软件极大地提高了工作效率 传统的DNS解析管理方式在处…

IoT [remote electricity meter]

IoT [remote electricity meter] 物联网&#xff0c;远程抄表&#xff0c;电表数据&#xff0c;举个例子

sql数据库-排序查询-DQL

目录 语法 排序方式 举例 将表按年龄从小到大排序 将表按年龄从大到小排序 ​编辑 多重排序 将表按年龄升序&#xff0c;年龄相同按入职时间降序 语法 select * from 表名 order by 字段名1 排序方式1&#xff0c;字段2 排序方式2; 排序方式 升序&#xff1a;ASC&…

在spring boot工程中使用Filter时,@WebFilter 注解不生效的问题分析和解决方案

1. 问题描述 首先编写一个Filter类并通过Component放入spring容器中&#xff0c;通过实现jakarta.servlet中提供的Filter接口完成过滤器的创建&#xff0c;代码如下。 import jakarta.servlet.*; import jakarta.servlet.annotation.WebFilter; import org.springframework.st…

学习threejs,使用TWEEN插件实现动画

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;threejs gis工程师 文章目录 一、&#x1f340;前言1.1 ☘️THREE.PLYLoader PLY模型加…

TypeScript在现代前端开发中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 TypeScript在现代前端开发中的应用 引言 TypeScript 概述…

CTF-Crypto-简单加密

打开首页看题目 描述看起来是一段乱码&#xff0c;拉入随波逐流&#xff0c;未解决 e6Z9i~]8R~U~QHE{RnY{QXg~QnQ{^XVlRXlp^XI5Q6Q6SKY8jUAA 观察字符串&#xff0c;末尾是AA&#xff0c;其中可能含有base64加密 找寻Ascll码表&#xff0c;发现A的Ascll是65&#xff0c;的Ascl…

MacOS下,如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能

MacOS下&#xff0c;如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能 在Mac上的Safari浏览器中&#xff0c;可以通过实况文本功能来实现图片中的文本翻译。关闭步骤具体步骤如下&#xff1a; 在浏览器地址栏&#xff0c;鼠标右击翻译按钮&#xff0c;然后点击“首选…

操作系统——虚拟存储器(含思维导图)

本教材为中国铁道出版社——操作系统&#xff08;第四版&#xff09;刘振鹏、张明、王煜著。本篇文章为第六章复习。 目录 思维导图&#xff1a; ​编辑一、虚拟存储器 1.理论基础 2.定义 二、分页虚拟存储管理 1.基本原理 2.缺页中断 3.页面置换 &#xff08;1&…

基于8.0 Update 3b 的ESXi-Arm Fling

很久没有更新过 ESXi-Arm 的版本了&#xff0c;博通旗下的 VMware 居然把它更新到了 8.0U3b。 下载地址&#xff1a;https://community.broadcom.com/flings 我准备使用离线更新&#xff0c;就没有下载 ISO&#xff0c;直接下载ESXi-Arm-Offline-Depot-2_00-dl.zip scp 上传…

python解析网页上的json数据落地到EXCEL

安装必要的库 import requests import pandas as pd import os import sys import io import urllib3 import json测试数据 网页上的数据结构如下 {"success": true,"code": "CIFM_0000","encode": null,"message": &quo…

C#桌面应用制作计算器

C#桌面应用制作简易计算器&#xff0c;可实现数字之间的加减乘除、AC按键清屏、Del按键清除末尾数字、/-按键取数字相反数、%按键使数字缩小100倍、按键显示运算结果等...... 页面实现效果 功能实现 布局 计算器主体使用Panel容器&#xff0c;然后将button控件排列放置Pane…

谷歌推出设备内置人工智能,实时向手机用户发出诈骗电话警报

Google 宣布推出适用于 Android 的新安全功能&#xff0c;可实时防御诈骗和有害应用。 这些功能由先进的设备内置 AI 提供支持&#xff0c;可在不损害隐私的情况下增强用户安全性。 这些新的安全功能首先在 Pixel 上推出&#xff0c;并将很快在更多 Android 设备上推出。 诈…

HarmonyOS ArkTs 解决流式传输编码问题

工作日志 日期&#xff1a;2024-11-15 标题&#xff1a;HarmonyOS ArkTs 解决流式传输编码问题 问题描述 问题&#xff1a;在处理流式数据的 HTTP 请求时&#xff0c;服务器返回的数据存在编码问题&#xff0c;导致数据无法正确地解码为字符串。部分数据在解码后出现了乱码…

MySQL数据库最大连接数查询及修改

MySQL数据库最大连接数查询及修改 1. 客户端连接数超出异常案例 Navicat连接异常信息如下&#xff1a; 2. 查看MySQL最大客户端连接数 通过mysql client命令登录MySQL数据库&#xff08;登录用户不受限制&#xff0c;既可以是 root管理员用户&#xff0c;也可以是常规用户&a…

使用Wireshark获取USB HID(Human Interface Device)报告描述符

使用Wireshark选择需要获取的USB进行抓取数据&#xff0c;找到设备&#xff08;host&#xff09;接收信息的数据 第二栏出现hid报告&#xff0c;右击选择复制流 将复制的内容粘贴到USB标准请求及描述符在线分析工具 - USB中文网 进行解析 以图中获取手写板的数据为例&#xff…

TofuAI处理BT1120时序视频要求

时序要求 BT.1120视频用于1920x108030Hz数字视频输入。具体时序必须严格按照说明。BT.1120输入电平为1.8V。 BT1120数字视频采用YCbCr彩色格式输出&#xff0c;串行数据位宽为16bit&#xff0c;亮度在 高8bit&#xff0c;色度在低8bit&#xff0c;亮度和色度在同一个时钟周期输…

聊天服务器(8)用户登录业务

目录 登录状态业务层代码数据模型层代码记录用户的连接信息以及线程安全问题客户端异常退出业务 登录状态 登录且状态变为online 业务层代码 #include "chatservice.hpp" #include "public.hpp" #include <string> #include <muduo/base/Loggi…

通用定时器---输出比较功能

目录 一、概念 二、输出比较的8种模式 三、输出比较输出PWM波形的基本结构 配置步骤 四、示例代码 一、概念 OC&#xff08;OutPut Compare&#xff09;输出比较。输出比较可以通过比较CNT与CCR寄存器的关系&#xff0c;来对输出电平进行置1/置0/翻转的操作&#xff0c;可…

Wireshark中的length栏位

注&#xff1a;Ethernet II的最小data length为46&#xff0c;如果小于&#xff0c;会补全到46. 1.指定网卡抓取的&#xff0c;链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…