UE4/5多人游戏详解(四、加入游戏会话,数值key和value,寻找IP地址)

news2025/6/17 10:05:08

目录

 

加入游戏会话

找到会话

加入会话

代码:

设置会话key和value

代码:

在寻找会话中添加匹配:

代码:

寻找IP地址:

代码:

 回调函数onJoinSessionComplete实现:

代码:

 测试:


目录

加入游戏会话

找到会话

加入会话

​编辑

代码:

设置会话key和value

代码:

在寻找会话中添加匹配:

​编辑代码:

寻找IP地址:

代码:

 回调函数onJoinSessionComplete实现:

代码:

 测试:


加入游戏会话

找到会话

做一个函数,这个函数是用来让玩家加入游戏会话的。

一样是在角色的.h文件里面创建:

和之前一样,将回调函数委托进行绑定

然后:

开始实现做的函数和回调函数

函数joinGameSession

然后是回调函数:

这里我们测试可不可以找到我们: 

看来是可以的。

加入会话

第一步是创建一个大厅的地图:

创建之后,我们进入cpp文件:

找到创建会话时候调用回调函数这里:

现在只是判断我们是否创建成功后打印,我们要在找到创建成功之后,进入这个Lobby的等待大厅,所以:

代码:

//创建指针获取现在所在的世界
		UWorld* myWorld = GetWorld();
		if (myWorld)//判断其有效性
		{
			//这里Content替换为Game,之前讲过,这是十分值得注意的地方(这里可以不用.umap,因为系统已经知道了)
			//最后这里添加  ?listen  这样是让玩家进入大厅之后,打开大厅这个监听服务器
			myWorld->ServerTravel(FString("/Game/Map/Lobby?listen"));
		}

设置会话key和value

现在来到创建函数的地方

 

现在我们要在这里面进行一些设置

可以看见要输入的是一个Key和一个Value,所以我们可以进去看看,我们可以输入的value是什么类型的:

在知道了可以输入什么类型之后,我们可以开始写了:

代码:

//这一行代码的目的是将在线游戏会话的匹配类型设置为自由对战,并广告发送到在线服务和Ping以使其他玩家可以找到和加入该会话。
	mySessionSettings->Set(FName("MatchType"),FString("FreeForAll"),EOnlineDataAdvertisementType::ViaOnlineServiceAndPing);

在寻找会话中添加匹配:

找到寻找函数的回调函数

找到之后,我们可以看见在这里我已经找到了id和使用者名字

接下来我们就需要在这里添加一个:

然后在下面这里判断是否匹配

代码:

void AMorePersonTestCharacter::onFindSessionComplete(bool findSeesionYorN)
{
	//寻找会话
	//遍历myOnlineSessionSearch里面存储的会话数组
	for (auto Result : myOnlineSessionSearch->SearchResults)
	{
		FString id = Result.GetSessionIdStr();
		FString UserName = Result.Session.OwningUserName;
		//创建MatchTypeValue,这个将用来接受获取的value值
		FString MatchTypeValue;
		//这里找到key值后,将其value值放入MatchTypeValue里面
		Result.Session.SessionSettings.Get(FName("MatchType"), MatchTypeValue);
		
		//这里判断value值是否匹配
		if (MatchTypeValue ==FString("FreeForAll"))
		{
			//打印放到这里面
			if (GEngine){GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Green,FString::Printf(TEXT("MatchTypeValue:%s"),*MatchTypeValue));}
		}
	}
}

寻找IP地址:

创建函数和委托:

 

首先第一步是一样的在构造函数中绑定委托

然后我们找到寻找的回调函数,添加: 

代码:

void AMorePersonTestCharacter::onFindSessionComplete(bool findSeesionYorN)
{
	//判断接口是否有效
	if (!myOnlineSessionInterface.IsValid())
	{
		return;
	}

	//寻找会话
	//遍历myOnlineSessionSearch里面存储的会话数组
	for (auto Result : myOnlineSessionSearch->SearchResults)
	{
		FString id = Result.GetSessionIdStr();
		FString UserName = Result.Session.OwningUserName;
		//创建MatchTypeValue,这个将用来接受获取的value值
		FString MatchTypeValue;
		//这里找到key值后,将其value值放入MatchTypeValue里面
		Result.Session.SessionSettings.Get(FName("MatchType"), MatchTypeValue);
		
		//这里判断value值是否匹配
		if (MatchTypeValue ==FString("FreeForAll"))
		{
			//打印放到这里面
			if (GEngine){GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Green,FString::Printf(TEXT("MatchTypeValue:%s"),*MatchTypeValue));}
		}
		//将回调函数加入委托
		myOnlineSessionInterface->AddOnJoinSessionCompleteDelegate_Handle(JoinSessionCompleteDelegate);
		//获取本地玩家控制器指针
		const ULocalPlayer* localPlayer = GetWorld()->GetFirstLocalPlayerFromController();
		//调用加入会话-->结束后调用回调函数
		myOnlineSessionInterface->JoinSession(*localPlayer->GetPreferredUniqueNetId(), NAME_GameSession, Result);
	}
}

 回调函数onJoinSessionComplete实现:

代码:

void AMorePersonTestCharacter::onJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result)
{
	//判断是否有效
	if (!myOnlineSessionInterface.IsValid())
	{
		return;
	} 
	//根据会话名字,获取ip地址到IPAddress
	FString IPAddress;
	if (myOnlineSessionInterface->GetResolvedConnectString(NAME_GameSession, IPAddress))
	{	
		//打印
		if (GEngine) { GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Yellow, FString::Printf(TEXT("Connect String:%s"), *IPAddress)); }
		//从游戏实例里面获取第一个玩家控制器
		APlayerController* myPlayerController = GetGameInstance()->GetFirstLocalPlayerController();
		if (myPlayerController)
		{
			//根据地址,进入游戏
			myPlayerController->ClientTravel(IPAddress,ETravelType::TRAVEL_Absolute);
		}
	}
}

 测试:

毫无疑问是成功了:

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

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

相关文章

音视频开发六:FFmpeg日志使用

常用日志级别 在 FFmpeg 中,error、warning、info、verbose 和 debug 是指不同的日志级别,各自对应的是不同类型的日志信息。具体的解释如下: error: 输出错误信息,表示程序出现了无法恢复的错误,需要立即停止执行。…

通过数据库逆向生成表和属性word文档(PDMan/PowerDesigner)及遇到问题记录

目录背景通过PDMan导出word文档步骤导出文档格式自定义格式导出Word失败问题解决出错原因:[object Object]解决方式通过PowerDesigner导出word文档导出步骤导出结果PowerDesigner使用问题记录DSN警告Could not Initialize JavaVM!mysql odbc安装使用下载安装版&…

数据结构——算法的时间复杂度和空间复杂度

文章目录算法效率时间复杂度时间复杂度的定义大O渐进渐进表示法常见的时间复杂度计算举例空间复杂度算法效率 我们在算法的设计中,会去衡量算法的好坏。那么算法效率就是衡量标准之一。除此之外,我们也会关注到算法的健壮性、正确性、可读性、效率与低存…

C语言课设项目-51单片机-定时器和计数器

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 一、定时器的原理 1、CPU时序的有关知识 2、在学习定时器之前需要明白的 3、定时/计数器的工作原理 4、…

Mybatis(八)动态Sql的实现原理

一、动态Sql的使用 顾名思义&#xff0c;动态sql值得是事先无法预知具体条件&#xff0c;需要在运行时根据具体的情况动态生成Sql语句。例如: <sql id"userAllField">id,create_time, name, password, phone, nick_name</sql><select id"getUse…

通过工具生成指定 类型 大小 文件

今天给大家介绍一个神器 首先 大家在开发过程中或许经常需要涉及到文件上传类的功能 需要测试文件过大 空文件等等清空 不同大小的文件 而这种文件大小是比较不好控制的 但大家可以下载我的资源 文件生成工具(可生成指定大小 类型文件) 下载下来里面就有一个 fileGeneration…

Mysql的用户管理与权限管理

文章目录用户管理创建用户查看用户字段解释hostUserselect_priv , insert_priv等修改密码修改用户删除用户权限管理查看权限查看当前用户权限查看某用户的全局权限查看某用户的某库的权限查看某用户的某个表的权限授予权限例一例二例三收回权限例一例二专栏目录请点击 用户管理…

目标检测框架yolov5环境搭建

目前&#xff0c;目标检测框架中&#xff0c;yolov5 是很火的&#xff0c;它基于pytorch框架&#xff0c;集成opencv等框架&#xff0c;项目地址&#xff1a;https://github.com/ultralytics/yolov5&#xff0c;对我来说&#xff0c;机器学习、深度学习才开始接触&#xff0c;本…

web前端 --- 表单标签

表单标签 --- 行内标签 描述&#xff1a;一个完整的表单标签通常由表单域、表单控件&#xff08;表单元素&#xff09;和提示信息三部分构成 作用&#xff1a;数据交互&#xff08;C/S&#xff09; &#xff08;1&#xff09;表单域 --- <form> <form>标签用于定义…

一款适合程序员的 Markdown 简历模版,拒绝花里胡哨

一款适合 IT 行业的 Markdown 简约简历模版&#xff0c;拒绝花里胡哨 开始使用 &#xff08;1&#xff09;安装 Markdown 编辑软件&#xff0c;推荐使用 Typora 编辑器&#xff08;免费版 Typora 百度网盘下载点此下载&#xff09;。 &#xff08;2&#xff09;下载本项目&am…

Ansys Speos | 实现车内氛围灯早期仿真验证

在本例中&#xff0c;将演示如何使用Speos进行RGB(红、绿、蓝)车内环境照明的早期研究&#xff0c;目的是在设计光导之前评估指定位置的照明效果。 使用到的产品Ansys Speos 2022 R2或更高版本&#xff0c;license为Enterprise版本能激活人眼视觉效果。 概览 在汽车行业&#…

Nginx的优化,安全与防盗链

1.Nginx的页面优化 1.1 Nginx的网页压缩 在Nginx的ngx_http_gzip_module压缩模块提供对文件内容压缩的功能。进行相关的配置修改&#xff0c;就能实现Nginx页面的压缩&#xff0c;达到节约带宽&#xff0c;提升用户访问速度 vim /usr/local/nginx/conf/nginx.conf http { ..…

#算法记录 | Day33 贪心算法

1005.K次取反后最大化的数组和 class Solution:def largestSumAfterKNegations(self, A: List[int], K: int) -> int:A sorted(A, keyabs, reverseTrue) # 将A按绝对值从大到小排列for i in range(len(A)):if K > 0 and A[i] < 0:A[i] * -1K - 1if K > 0:A[-1] *…

最基础的electron打包运行配置,以及Electron Builder 和 Electron Forge两者差异

node版本 v16.19.0 开发之前请务必去官网查看node所支持的版本&#xff0c;不然安装会报错 推荐使用 yarn 包管理 引入electron依赖 yarn add electron22.3.6 -D yarn add electron-builder -D创建electron配置文件 我这边为了模块化开发&#xff0c;将electron相关文件放…

Chapter3: Design Creation with RTL(ug949)

&#xff08;3.5&#xff09;Clock Domain Crossing 设计中的跨时钟域电路直接影响设计的可靠性。您可以设计自己的电路&#xff0c;但Vivado design Suite必须识别电路&#xff0c;并且必须正确应用ASYNC_REG属性。Xilinx提供XPM以确保正确的电路设计&#xff0c;包括…

【c/c++编译工具】——Cmake的学习

简介 目录 简介 1. Cmake的基本语法 2. 常用指令 3. CMake常用的变量 4. CMake编译工程 5. 构建方式 6. 实战---CMake代码实战 CMake是一个跨平台的安装编译工具&#xff0c;可以用简单的语句来描述所有平台的安装(编译过程)。CMake可以说已经成为大部分C开源项目标配…

将自己的服务注册成Windows服务

winsw下载地址 https://github.com/winsw/winsw/releases 如何注册服务 将WinSW.exe复制到自定义的目录同目录下创建projectName.xml。特别注意&#xff0c;xml和exe必须同名配置 xml文件 xml配置信息如下 <service><id>wjb-member</id><name>wjb-me…

15-721 Chapter7 索引

锁的分类 锁占用少量内存&#xff0c;实际上在不竞争的情况下性能不错. 第一个就是靠test_and_set实现的自旋锁&#xff0c;高效&#xff0c;因为在用户态&#xff0c;但是却不可扩展&#xff0c;对cache&#xff0c;os都不友好 第二个是mutex&#xff0c;实际上两个部分组成…

浮空,定位

浮动原理&#xff1a; 清除浮动 高度塌陷是怎么造成的&#xff0c;浮动元素脱离当前文档流&#xff0c;然后无法撑起父容器导致了高度塌陷&#xff0c;因为父容器没有设置高度 解决方法&#xff1a; 1.将父元素变成bfc元素 2.父元素浮动 3.清除浮动&#xff1a; 通过给父元…

小伙被内卷逼成扫地僧,把牛客网所有面试题整理成25W字面试手册

很多工作过了 5 年之后的工程师&#xff0c;都表示写不动 CRUD 代码了&#xff0c;都会考虑转架构师&#xff0c;但是一想到面试&#xff0c;可能心里就会一紧。 一般面试大厂架构师的岗位至少需要 3 轮技术面试&#xff0c;我咨询了一下阿里的大佬&#xff0c;了解到每一轮的…