UE4/5多人游戏详解(六、多人游戏插件的菜单,创建会话设置和加入)

news2024/11/16 1:56:24

目录

简单的菜单

创建新的c++类:

这里可能出现的报错:

菜单设置:

代码:

UI创建:

C++类中创建按钮的指针:

子系统创建

创建会话函数:

创建会话后前往大厅:

重载函数

变量添加


简单的菜单

创建新的c++类:

 

这里可能出现的报错:

如果创建了这个之后,发生大量报错,显示未知的符号

请在.bulid.cs文件中加入”UMG”这个模块。

 除此之外我们还需要加几个模块进去:

 

接下来我们可以开始创建函数:

菜单设置:

首先是做一个设置菜单的函数:

 

代码:

头文件:

#pragma once

#include "CoreMinimal.h"
#include "Blueprint/UserWidget.h"
#include "InPluginsMenu.generated.h"

/**
 * 
 */
UCLASS()
class MULTIPLAYERSESSIONPLUGIN_API UInPluginsMenu : public UUserWidget
{
	GENERATED_BODY()
public:
	//菜单设置
	UFUNCTION(BlueprintCallable)
	void MenuSet();
};

 Cpp文件:

#include "InPluginsMenu.h"

void UInPluginsMenu::MenuSet()
{
	//添加到视口
	AddToViewport();
	//设置可视
	SetVisibility(ESlateVisibility::Visible);
	//bIsFocusable设置为true是允许点击的时候受到焦点,是UserWidget里面定义的
	bIsFocusable = true;
	
	UWorld* world = GetWorld();
	if (world)
	{
		APlayerController* playerControler = world->GetFirstPlayerController();
		if (playerControler)
		{
			//FInputModeUIOnly 用于设置只允许ui响应用户输入的输入模式的数据结构
			FInputModeUIOnly inputModeData;
			//SetWidgetToFocus设置焦距
			//TakeWidget()获取底层的slate部件,不存在则构造它
			inputModeData.SetWidgetToFocus(TakeWidget());
			//设置鼠标在视口的行为,这里是不锁定
			inputModeData.SetLockMouseToViewportBehavior(EMouseLockMode::DoNotLock);
			//设置完毕输入模式的东西之后,在玩家控制器里面将设置好的输入模式设置到玩家控制器的输入模式
			playerControler->SetInputMode(inputModeData);
			//显示鼠标光标
			playerControler->SetShowMouseCursor(true);
		}
	}
}

UI创建:

用户控件的创建我就不说了,懂的都懂,很简单。

 

记得将其父类换为自己做的c++类:

 

 

然后你可以在关卡蓝图中设置测试一下效果,当然也可以不测试,这并不影响。

C++类中创建按钮的指针:

记得在cpp文件里面添加头文件:

#include "Components/Button.h"

 

当然你想的话可以在下面两个函数里面添加打印,看看是否链接上了。

子系统创建

创建一个处理所有会话的子系统指针(在menu的private里面):

 

既然创建了这个类,在cpp中我们想要调用自然也是需要将这个类的头文件放在cpp文件里面:

#include "MultiPlayerSessionGISubsystem.h"

在这之后,我们在构造函数里面获取这个类的实例:

 

子系统就这样创建完毕了,接下来就是实现其他的函数了。

创建会话函数:

 在此之前要添加的东西:

 

 

 

在这个点击函数里面加入创建函数,接下来我们要实现每一个不同的函数:

第一个是是create session的代码,因为太多就不展示图片了,直接上代码:

void UMultiPlayerSessionGISubsystem::CreateSession(int32 playerConnectNum, FString MatchType)
{
	//判断会话系统是否有效
	if (!mySessionInterface.IsValid())
	{
		return;
	}
	//有会话则获取现有的会话
	auto ExistingSession = mySessionInterface->GetNamedSession(NAME_GameSession);
	//如果现有的会话并不是空的
	if (ExistingSession != nullptr)
	{
		//删除游戏会话
		mySessionInterface->DestroySession(NAME_GameSession);
	}
	//在会话创建请求完成时触发委托CreateSessionCompleteDelegate,返回句柄到CreateSessionCompleteDelegateHandle,方便之后删除
	CreateSessionCompleteDelegateHandle = mySessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);
	//
	LastSessionSettings = MakeShareable(new FOnlineSessionSettings());
	//判断现在的接口是不是空的,是则返回true,不是则返回false【此游戏将仅限局域网,外部玩家无法看到,是true还是false】
	//直接在这里判断你是局域网还不是
	LastSessionSettings->bIsLANMatch = IOnlineSubsystem::Get()->GetSubsystemName()=="NULL"?true:false;
	//可用的连接数量是多少
	LastSessionSettings->NumPublicConnections = playerConnectNum;
	//是否允许加入线程
	LastSessionSettings->bAllowJoinInProgress = true;
	//是否允许通过玩家存在加入
	LastSessionSettings->bAllowJoinViaPresence = true;
	//该比赛是否在在线服务上面公开广告
	LastSessionSettings->bShouldAdvertise = true;
	//是否显示用户状态信息
	LastSessionSettings->bUsesPresence = true;
	//不同key和value的匹配,从现有会话设置中定义会话设置
	LastSessionSettings->Set(FName("MatchType"), MatchType, EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);

	//获取本地的第一个玩家控制器
	const ULocalPlayer* localPlayer = GetWorld()->GetFirstLocalPlayerFromController();
	//*localPlayer->GetPreferredUniqueNetId() 首选唯一网格ID
	//判断创建会话是否成功
	if (!mySessionInterface->CreateSession(*localPlayer->GetPreferredUniqueNetId(), NAME_GameSession, *LastSessionSettings))
	{
		//创建失败
		//委托列表中删除委托,传入的是一个句柄(这个CreateSessionCompleteDelegateHandle在上面获取过)
		mySessionInterface->ClearOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegateHandle);
	}
}

创建会话后前往大厅:

现在回到我们的菜单中:

 我们实现了创建会话的函数,这样我们就可以在点击按钮之后创建一个会话:

 接下来就是我们创建了一个会话之后应该要前往哪里:

 

但如果测试过就会发现,我们来到新的地图之后,我们仍然是处于一种无法行动的状态。

原因自然也很简单,因为我们的输入模式仍然是处于只允许ui输入的一个状态

对此我们需要做一个专门移除控件的函数

 

之后在哪里调用呢?

重载函数

对此我们需要重载一个函数:

 然后:

 

变量添加

在菜单的头文件中,我们需要添加一些变量,比如说连接的人数之类的,这是为了之后更好的进行调整而准备的。

 然后在菜单设置的函数中进行替换:

 然后将创建会话的这里更改为自己的私有变量:

 测试:

 

 

 

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

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

相关文章

Java 线程

线程:线程是进程的组成部分,一个进程可以拥有多个线程,而一个线程必须拥有一个父进程。线程可以拥有自己的堆栈,自己的程序计数器和自己的局部变量,但不能拥有系统资源。它与父进程的其他线程共享该进程的所有资源。 …

PowerShell install Docker+docker-compoer

docker 前言 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。 …

Linux搭建SVN服务器详细教程

前言 本文讲解 Linux 系统下如何搭建 SVN 服务器,详细说明各配置项的功能,最终实现可管控多个项目的复杂配置。 SVN 是 subversion 的缩写,是一个开放源代码的版本控制系统,通过采用分支管理系统的高效管理,实现最终集…

【转】使用Midjourney绘制小漫画

原帖地址:【Midjourney教程】设计麻瓜也能15分钟一篇小漫画 Midjourney能帮我画漫画,话不多说,下方成品图 Part 1 你想画什么 画漫画当然要有故事情节,你总得确定,你要画个啥?也就是专业人士说的画面分镜,当然咱们是“野狐禅”,就不扯的太细,太细我也不会… 由于只…

软考中级软件评测师备考攻略

软件评测师属于软考中级,考试虽然没有软考高级难度大,但是会比软考初级要难,所以想要通过软件评测师考试还是需要花时间去用心备考的。 一、软件评测师职业前景: 随着互联网技术的不断发展,软件评测师的市场需求也会…

【CocosCreator入门】CocosCreator组件 | Canvas(画布)组件

Cocos Creator 是一款流行的游戏开发引擎,具有丰富的组件和工具,其中的Canvas能够将游戏物体渲染到屏幕上。 目录 一、组件介绍 二、渲染模式 三、组件属性 四、组件使用 五、脚本示例 一、组件介绍 Canvas组件是Cocos Creator中重要的组件之一。在…

【Socket】之TCP数据报套接字

1. 介绍下API 1.1 ServerSocket API 这是创建TCP服务端Socket的API。 构造方法方法说明ServerSocket(int port)创建一个服务端流套接字Socket,并绑定到指定端口 普通方法方法说明ServerSocket.accept()开始监听指定端口(创建时绑定的端口&#xff09…

Spring学习——Nginx

Nginx概述 Nginx介绍 Nginx是一款轻量级的web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器。其特点是占有内存少,并发能力强,事实上nginx的并发能力在同类型的网页服务器中表现较好,中国大陆使用nginx的网…

Python学习之DateTime

文章目录 前言一、pandas是什么?二、使用步骤1.引入库2.使用date.today()打印日期3.Python当前日期和时间:now() today()总结 4.如何使用 Strftime()格式化日期和时间输出1. 首先,我们将看到一个简单的如何格式化年份的步骤。通过一个例子来理…

【微服务笔记18】微服务组件之Gateway实现服务限流(计数器算法、漏桶算法、令牌桶算法)

这篇文章,主要介绍微服务组件之Gateway实现服务限流(计数器算法、漏桶算法、令牌桶算法)。 目录 一、服务限流 1.1、几种限流算法 (1)计数器算法 (2)漏桶算法 (3)令…

叮咚,你的耳鼻喉专科医院营销策略快来查收

进入后疫情时代以来,人们对健康意识的不断提高,医疗行业也开始卷起来了,通过各种渠道来宣传和推广医院,吸引更多的患者。那么今天就以耳鼻喉专科医院为主,聊聊这类医院该怎么在Z时代做好营销。 医院营销可以分为线上和…

【行为型模式】观察者模式

文章目录 1、概述2、结构3、实现方式3.1、案例引入3.2、结构分析3.3、具体实现 4、观察者模式优缺点5、应用场景 1、概述 观察者模式(Observer)是一种行为设计模式,它定义了对象之间的一对多依赖关系,当一个对象的状态发生改变时,其他所有依…

【C++】二叉搜索树的应用

前言 二叉搜索树本质也是二叉树,但因为其数据存储的特殊 — 左子树的值都更小,右子树的值都更大,所以在大部分情况下,查找更为高效。本篇博客将讲述二叉搜索树两个应用搜索的场景 那么话不多说,马上开始今天的学习。 文…

linux运维必了解的日志文件系统

目录 一、inode与block1.1inode和block概述1.1.1inode和block的关系 1.2inode的内容1.2.1inode包含文件的元信息1.2.2linux文件系统的三个时间戳1.2.3目录文件结构 1.3inode的号码1.3.1 硬盘分区后的结构 1.4inode的大小1.5恢复误删除的xfs文件1.6EXT类型文件恢复误删除 二、分…

亿发软件:玩具批发行业需要怎样的进销存开单软件

中国玩具市场的发展潜力十分巨大,近五年来中国玩具行业的批发零售企业都保持着良好的发展态势。近年来,在数字化转型的时代浪潮下,玩具批发零售市场想实现进一步的高质量发展,充分满足客户多元化的供货需求,需要向数据…

Qt5 和 OpenCV4 计算机视觉项目:6~9

原文:Qt 5 and OpenCV 4 Computer Vision Projects 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候&#x…

OpenCV 图像处理学习手册:6~7

原文:Learning Image Processing with OpenCV 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 计算机视觉 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 当别人说你没有底线的时候,…

javascript之数组

创建 有以下几种方式 1.构造函数 在使用构造函数时,可以不带new 创建空数组 let color new Array() 或者let color Array() 创建指定个数元素的数组 let color new Array(2) 或者let color Array(2) 创建指定元素的数组 let color new Array("bl…

atio函数和宏offset的介绍

目录 前言atoi函数宏offsetof总结 前言 本章带大家一起认识一些在我们C语言标准库中的函数 atoi函数 int atio(const char* str);头文件&#xff1a; #include<stdlib.h>参数&#xff1a; str指向常量字符串起始位置的指针 函数介绍&#xff1a; ①解析C语言字符串str,…

2023软件测试工程师必备技能?要卷,谁还不会了......

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 软件测试岗位是怎…