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]);
}

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

后台管理系统(开箱即用)

很久没有更新博客了&#xff0c;给大家带上一波福利吧,大佬勿扰 现在市面上流行的后台管理模板很多,若依,芋道等,可是这些框架对我们来说可能会有点重,所以我自己从0到1写了一个后台管理模板,你们使用时候可扩展性也会更高 项目主要功能: 成员管理&#xff0c;部门管理&#…

【ubuntu】Geogebra

Geogebra 几何作图工具 是一款跨平台的几何作图工具软件&#xff0c; 目前已经覆盖了&#xff0c; windows&#xff0c;android&#xff0c; mac, linux 等操作系统。 Ubuntu 现状 Ubuntu 自带应用市场 Ubuntu 自带应用市场目前只有 Geogebra 4.0 版本&#xff0c; 不能画立…

MySQL--数据库基础

1. 数据库简介 1.1什么是数据库&#xff1f; 简单来说就是组织和保存数据的应用程序。 数据库是20世纪60年代末发展起来的⼀项重要技术&#xff0c;已经成为计算机科学与技术的⼀个重要分⽀。数据库技术主要是⽤来解决数据处理的⾮数值计算问题&#xff0c;数据处理的主要内容…

《生成式 AI》课程 第3講 CODE TASK 任务2:角色扮演的机器人

课程 《生成式 AI》课程 第3講&#xff1a;訓練不了人工智慧嗎&#xff1f;你可以訓練你自己-CSDN博客 我们希望你设计一个机器人服务&#xff0c;你可以用LM玩角色扮演游戏。 与LM进行多轮对话 提示:告诉聊天机器人扮演任意角色。 后续输入:与聊天机器人交互。 Part 2: Role…

SpringCloud篇(配置中心 - Nacos)

目录 一、Nacos 配置中心 1. 统一配置管理 1.1. 在nacos中添加配置文件 1.2. 从微服务拉取配置 1.2.1. 引入nacos-config依赖 1.2.2. 添加bootstrap.yaml 1.2.3. 读取nacos配置 1.2.4. 页面访问 2. 配置热更新&#xff1a;两种 2.1. 方式一 2.2. 方式二 3. 配置共享…

Docker 基础命令介绍和常见报错解决

介绍一些 docker 可能用到的基础命令&#xff0c;并解决三个常见报错&#xff1a; 权限被拒绝&#xff08;Permission Denied&#xff09;无法连接到 Docker 仓库&#xff08;Timeout Exceeded&#xff09;磁盘空间不足&#xff08;No Space Left on Device&#xff09; 命令以…

js识别二维码

需要下载的js文件&#xff1a;https://download.csdn.net/download/impossible1994727/90001718https://download.csdn.net/download/impossible1994727/90001718 或者直接复制也行&#xff1a; var _aa {}; _aa._ab function (f, e) { var d qrcode.width; var b qrcode…

Uniapp踩坑input自动获取焦点ref动态获取实例不可用

前言 大家好我是没钱的君子下流坯&#xff0c;用自己的话解释自己的知识。很久很更新了&#xff0c;这几个月一直在加班&#xff0c;今天记录一个uniapp关于input中focus()方法自动获取焦点的坑。 案例 为了实现一个手机验证码的页面&#xff0c;验证码是五个输入框&#xf…

GA/T1400视图库平台EasyCVR视频融合平台HLS视频协议是什么?

在数字化时代&#xff0c;视频监控系统已成为保障安全、提升效率的关键技术。EasyCVR视频融合云平台&#xff0c;作为TSINGSEE青犀视频在“云边端”架构体系中的重要一环&#xff0c;专为大中型项目设计&#xff0c;提供了一个跨区域、网络化的视频监控综合管理系统平台。它不仅…

文献解读-DNAscope: High accuracy small variant calling using machine learning

关键词&#xff1a;基准与方法研究&#xff1b;基因测序&#xff1b;变异检测&#xff1b; 文献简介 标题&#xff08;英文&#xff09;&#xff1a;DNAscope: High accuracy small variant calling using machine learning标题&#xff08;中文&#xff09;&#xff1a;DNAsc…

每日一博 - Java的Shallow Copy和Deep Copy

文章目录 概述创建对象的5种方式1. 通过new关键字2. 通过Class类的newInstance()方法3. 通过Constructor类的newInstance方法4. 利用Clone方法5. 反序列化 Clone方法基本类型和引用类型浅拷贝深拷贝如何实现深拷贝1. 让每个引用类型属性内部都重写clone()方法2. 利用序列化 概述…

【英特尔IA-32架构软件开发者开发手册第3卷:系统编程指南】2001年版翻译,2-25

文件下载与邀请翻译者 学习英特尔开发手册&#xff0c;最好手里这个手册文件。原版是PDF文件。点击下方链接了解下载方法。 讲解下载英特尔开发手册的文章 翻译英特尔开发手册&#xff0c;会是一件耗时费力的工作。如果有愿意和我一起来做这件事的&#xff0c;那么&#xff…

Odoo :一款免费开源的日化行业ERP管理系统

文 / 开源智造Odoo亚太金牌服务 概述 构建以 IPD 体系作为核心的产品创新研发管控体系&#xff0c;增进企业跨部门业务协同的效率&#xff0c;支撑研发管控、智慧供应链、智能制造以及全渠道营销等行业的场景化&#xff0c;构筑行业的研产供销财一体化管理平台。 行业的最新…

【Golang】——Gin 框架中间件详解:从基础到实战

中间件是 Web 应用开发中常见的功能模块&#xff0c;Gin 框架支持自定义和使用内置的中间件&#xff0c;让你在请求到达路由处理函数前进行一系列预处理操作。这篇博客将涵盖中间件的概念、内置中间件的用法、如何编写自定义中间件&#xff0c;以及在实际应用中的一些最佳实践。…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

云原生之运维监控实践-使用Telegraf、Prometheus与Grafana实现对InfluxDB服务的监测

背景 如果你要为应用程序构建规范或用户故事&#xff0c;那么务必先把应用程序每个组件的监控指标考虑进来&#xff0c;千万不要等到项目结束或部署之前再做这件事情。——《Prometheus监控实战》 去年写了一篇在Docker环境下部署若依微服务ruoyi-cloud项目的文章&#xff0c;当…

【C++】类中的“默认成员函数“--构造函数出现的意义?拷贝构造时“无穷递归”和“双重释放”出现的原因?

目录 "默认"成员函数 概念引入&#xff1a; 一、构造函数 问题引入&#xff1a; 1&#xff09;构造函数的概念 2&#xff09;构造函数实例 3&#xff09;构造函数的特性 4)关于默认生成的构造函数 (默认构造函数) 默认构造函数未完成初始化工作实例: 二…

fastapi 调用ollama之下的sqlcoder模式进行对话操作数据库

from fastapi import FastAPI, HTTPException, Request from pydantic import BaseModel import ollama import mysql.connector from mysql.connector.cursor import MySQLCursor import jsonapp FastAPI()# 数据库连接配置 DB_CONFIG {"database": "web&quo…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

基于Java Springboot城市交通管理系统

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数…