108. UE5 GAS RPG 实现地图名称更新和加载关卡
在这一篇里,我们将实现对存档的删除功能,在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置,我们可以通过存档进入游戏,玩家在游戏中可以在存档点存储存档。
实现删除存档
删除存档需要一个弹框确认,防止玩家误操作,所以,我们需要一个弹框的用户控件。
创建一个新的蓝图,基于我们之前自定义的用户空间基类。

然后添加对应的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]);
}
最后,我们在显示存档的用户控件里绑定地图名称的显示

并绑定加载进度的点击回调,调用进入关卡事件,并测试即可。


相关文章:
108. UE5 GAS RPG 实现地图名称更新和加载关卡
在这一篇里,我们将实现对存档的删除功能,在删除时会有弹框确认。接着实现获取玩家的等级和地图名称和存档位置,我们可以通过存档进入游戏,玩家在游戏中可以在存档点存储存档。 实现删除存档 删除存档需要一个弹框确认࿰…...
对称加密与非对称加密:密码学的基石及 RSA 算法详解
对称加密与非对称加密:密码学的基石及 RSA 算法详解 在当今数字化的时代,信息安全至关重要。对称加密和非对称加密作为密码学中的两种基本加密技术,为我们的数据安全提供了强大的保障。本文将深入探讨对称加密和非对称加密的特点、应用场景&…...
排列问题方法总结(递归+迭代)
递归 一、逐步生成结果法(无序) #include<iostream> #include<vector> #include<string> #include<algorithm>using namespace std;vector<string> GetChild(int n,int curIndex){vector<string> now;vector&…...
C#从入门到放弃
C#和.NET的区别 C# C#是一个编程语言 .NET .NET是一个在window下创建程序的框架 .NET框架不仅局限于C#,它还可以支持很多语言 .NET包括了2个组件,一个叫CLR(通用语言运行时),另一个是用来构建程序的类库 CLR 用C写一个程序,在一台8688的机器…...
视频质量评价学习笔记
目录 MD VQA:大淘宝团队: ReIQA KVQ 视频质量评价学习笔记 MD VQA:大淘宝团队: https://github.com/kunyou99/MD-VQA_cvpr2023?tabreadme-ov-file ReIQA GitHub - avinabsaha/ReIQA: Official implementation for CVPR2023 Paper "Re-IQA : U…...
OpenCV、YOLO、VOC、COCO之间的关系和区别
OpenCV、YOLO、COCO 和 VOC 是计算机视觉和深度学习领域常见的几个名词,它们分别代表不同的工具、算法和数据集,之间有一些联系和区别。下面分别说明它们的定义、用途以及相互关系。 1. OpenCV(Open Source Computer Vision Library…...
Pandas进行周期与时间戳转换
时间序列数据在数据分析和金融领域非常常见,处理这些数据时,通常会面临周期(Period)与时间戳(Timestamp)之间的转换需求。理解和掌握这种转换,对于时间序列数据的清洗、预处理以及进一步分析至关重要。Python 中的 pandas 库提供了一系列便捷的函数来帮助处理这些时间序…...
【GPTs】Get Simpsonized:一键变身趣味辛普森角色
博客主页: [小ᶻZ࿆] 本文专栏: AIGC | GPTs应用实例 文章目录 💯GPTs指令💯前言💯Get Simpsonized主要功能适用场景优点缺点使用方式 💯小结 💯GPTs指令 中文翻译: 指令保护和安全规则&…...
概率论公式整理
1 概率 古典概型和几何概型 古典概型(有限等可能)几何概型(无限等可能) 条件概率 P ( A ∣ B ) P ( A B ) P ( B ) P(A|B) \frac{P(AB)}{P(B)} P(A∣B)P(B)P(AB) 全概率公式 P ( B ) ∑ i 1 n P ( A i ) P ( B ∣ A i ) P…...
【C++】—— stack和queue的模拟实现
前言 stack 和 queue使用起来都非常简单,现在来模拟实现一下,理解其底层的原理。 在实现之前,应该知道,stack 和 queue 都是容器适配器,通过看官网文件也可以看出来;其默认的容器都是dequeÿ…...
管家婆工贸ERP BR039.采购订单关联MRP明细表
最低适用版本: 工贸系列 23.8 插件简要功能说明: 采购订单明细表,支持显示采购订单明细上游请购单明细关联的MRP中对应销售订单明细产成品相关信息更多细节描述见下方详细文档 插件操作视频: 进销存类定制插件--采购订单关联M…...
SwanLab安装教程
SwanLab是一款开源、轻量级的AI实验跟踪工具,提供了一个跟踪、比较、和协作实验的平台,旨在加速AI研发团队100倍的研发效率。 其提供了友好的API和漂亮的界面,结合了超参数跟踪、指标记录、在线协作、实验链接分享、实时消息通知等功能&…...
MySQL EXPLAIN,数据库调优的秘密通道
EXPLAIN 是 MySQL 中一个非常有用的工具,它用于分析 SQL 查询的执行计划。通过 EXPLAIN,你可以获取 MySQL 是如何准备执行你的 SQL 语句的,包括使用的索引、连接类型、扫描的行数等信息。这些信息对于优化查询性能、识别性能瓶颈至关重要。 使…...
利用redis的key失效监听器KeyExpirationEventMessageListener作任务定时提醒功能
某需求: 要求在任务截止日期的前3天时,系统自动给用户发一条消息提醒。 用定时任务的话感觉很不舒服。间隔时间不好弄。不能精准卡到那个点。 由于系统简单,没有使用消息列队,也不能使用延时队列来做。 用Timer的话开销还挺大的&a…...
如何基于Tesseract实现图片的文本识别
在前一篇文章基础上,如何将报告图片中的文本解析出来,最近研究了基于Tesseract的OCR方案,Tesseract OCR是一个开源的OCR引擎,主要结合开源的tesseract和pytesseract,实现了jpg/png等格式图片文本识别,供大家…...
JavaWeb之AJAX
前言 这一节讲JavaWeb之AJAX 1.概述 以前我们在servlet中得到数据,必须通过域给jsp,然后jsp在响应给浏览器 纯html不能获取servlet返回数据 所以我们用jsp 但是现在我们可以同AJAX给返回数据了 我们可以在sevlet中直接通过AJAX返回给浏览器 html中的J…...
算法---解决“汉诺塔”问题
# 初始化步骤计数器 i 1 # 定义移动盘子的函数 def move(n, mfrom, mto): global i # 使用全局变量i来跟踪步骤 print("第%d步:将%d号盘子从%s->%s" % (i, n, mfrom, mto)) # 打印移动步骤 i 1 # 步骤计数器加1 #第一种方法 # 定义汉诺塔问题的递归…...
1-Equity-Transformer:求解NP-Hard Min-Max路由问题的顺序生成算法(AAAI-24)(完)(code)
文章目录 AbstractIntroduction问题表述Methodology多智能体位置编码公平上下文编码训练方案ExperimentsmTSP的性能评估mPDP的性能评估Related WorkConclusionAbstract 最小最大路由问题旨在通过智能体合作完成任务来最小化多个智能体中最长行程的长度。这些问题包括对现实世界…...
linux001.在Oracle VM VirtualBox中ubuntu虚拟系统扩容
1.打开终端切换到virtualBox安装目录 2.输入命令扩容 如上终端中的代码解释: D:\Program Files\Oracle\VirtualBox>.\VBoxManage modifyhd D:\ubuntu18.04\Ubuntu18.04\Ubuntu18.04.vdi --resize 40960如上代码说明:D:\Program Files\Oracle\Virtual…...
RabbitMQ教程:路由(Routing)(四)
文章目录 RabbitMQ教程:路由(Routing)(四)一、引言二、基本概念2.1 路由与绑定2.2 Direct交换机2.3 多绑定2.4 发送日志2.5 订阅 三、整合代码3.1 EmitLogDirectApp.cs3.2 ReceiveLogsDirectApp.cs3.3 推送所有和接收e…...
uniapp 对接腾讯云IM群组成员管理(增删改查)
UniApp 实战:腾讯云IM群组成员管理(增删改查) 一、前言 在社交类App开发中,群组成员管理是核心功能之一。本文将基于UniApp框架,结合腾讯云IM SDK,详细讲解如何实现群组成员的增删改查全流程。 权限校验…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
Linux-07 ubuntu 的 chrome 启动不了
文章目录 问题原因解决步骤一、卸载旧版chrome二、重新安装chorme三、启动不了,报错如下四、启动不了,解决如下 总结 问题原因 在应用中可以看到chrome,但是打不开(说明:原来的ubuntu系统出问题了,这个是备用的硬盘&a…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序
一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...
优选算法第十二讲:队列 + 宽搜 优先级队列
优选算法第十二讲:队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...
用机器学习破解新能源领域的“弃风”难题
音乐发烧友深有体会,玩音乐的本质就是玩电网。火电声音偏暖,水电偏冷,风电偏空旷。至于太阳能发的电,则略显朦胧和单薄。 不知你是否有感觉,近两年家里的音响声音越来越冷,听起来越来越单薄? —…...
