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

news2024/12/30 2:42:37

目录

加入游戏会话

找到会话

加入会话

代码:

设置会话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/425259.html

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

相关文章

分立机器基站接入核心网并调试可用解决之路

问题描述 在两台机器上,分别为服务器A与主机B,其中服务器A上部署OAI核心网,主机B上部署容器版ueransim。两机器用一根网线连接。两台机器的连接如此:但是ueransim无法接入核心网。 解决思路1——机器网卡设置到192.168.70.0网段…

常用AI网站精简版

1.ChatGPT:ChatGPThttps://chat.openai.com/ 2.Discord社区:(AI绘图midjourney)Discord | Midjourney AI生图https://discord.com/channels/@me3.文心一言:

套利策略样本外跟踪

量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 专享策略No.2 | 商品股指通用套利策略(一) 日线版本: 15分钟版本: 专享02模型开发步骤: 1.计算套利品种价比的高开低收,不是价差。 2.计…

231:vue+openlayers绘制点、点击此点弹出坐标复制和取消功能

第231个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+openlayers项目绘制点、点击此点弹出坐标复制和取消功能,这里面的复制功能采用了ue-clipboard2插件。 直接复制下面的 vue+openlayers源代码,操作2分钟即可运行实现效果 示例效果 配置方式 1)查看基础设置:ht…

【数据挖掘与商务智能决策】第八章 K近邻算法

第八章 K近邻算法 1.K近邻算法简单代码演示 import pandas as pd df pd.read_excel(葡萄酒.xlsx) df原始样本酒精含量(%)苹果酸含量(%)分类0样本15201样本26102样本34103样本48314样本51021 # 特征变量和目标变量的切分 X_train df[[酒精含量(%),苹果酸含量(%)]] y_train …

安灯电子看板实时反馈产线上的生产状态

安灯电子看板是一种用于显示生产线运行情况的电子显示设备。它可以实时显示生产线的运行状态、异常信息以及工人的呼叫请求等信息,以便管理人员及时采取措施,保证生产线的正常运行。 安灯电子看板可以实现对生产线上各个环节的实时监控,并能够…

AutoGPT使用

windows和mac都可以使用 1,安装python 10 https://www.tutorialspoint.com/how-to-install-python-in-windows 2,下载AutoGPT代码 通过git克隆AutoGPT项目,git clone https://github.com/Torantulino/Auto-GPT.git如果没有安装git的同学就…

SalesForce-第一篇-概述

1. 直接一点,一上来就上图吧,这个是系统的前端页面,分为三个部分: 顶部的菜单栏,左下部的详细信息栏,以及右部相关信息栏位; 略微详细的为: a. 用户信息部分; b. 应用…

UDP套接字编程

文章目录一、IP地址和端口号二、网络字节序三、socket编程接口1.socket常见API2.sockaddr结构四、UDP套接字1.简单认识UDP协议2.利用UDP套接字实现网络版本大小写转换(1)服务端(2)客户端一、IP地址和端口号 IP协议目前有两个版本,分别是IPV4和IPV6,IP地…

【已解决】加载模型时报错:model_config = json.loads(model_config.decode(‘utf-8‘))

Author:AXYZdong 硕士在读 工科男 有一点思考,有一点想法,有一点理性! 定个小小目标,努力成为习惯!在最美的年华遇见更好的自己! CSDNAXYZdong,CSDN首发,AXYZdong原创 唯…

科普 | 带你了解设备振动监测常见术语

一、前言 状态监测是工厂预测维修和主动维修的基础,是企业优化资源,提升生产运营水平和市场竞争力的前提。成功开展状态监测将保证工厂设备长周期、满负荷、安全可靠地运行,避免非计划停机造成的损失,降低维修成本和生产成本。 …

如何高效的完成域名实名认证

根据注册局和工信部要求,需上传实名资料的域名有:.cn/.com/.net/.top/.xyz/.vip/.club/.ren/.wang/.shop/.xin/.中国/.信息等,相关要求请查看http://www.west.cn/faq/list.asp?unid1348。 如果您帐号下的域名较少,可以在域名管理…

【Dom获取属性操作】JavaScript 全栈体系(九)

Web APIs 第一章 Web API 基本认知 一、变量声明 变量声明有三个 var let 和 const建议: const 优先,尽量使用const,原因是: const 语义化更好很多变量我们声明的时候就知道他不会被更改了,那为什么不用 const呢&am…

数据结构_第十关:二叉树的顺序结构——堆

目录 1. 二叉树的顺序结构 2.堆的概念及结构 3.堆的实现 3.1堆向下调整算法 3.2堆的创建 3.3堆的插入 3.4建堆的复杂度 3.5堆的删除 4.堆的代码实现 4.1堆的定义 4.2堆的函数实现 1)堆的初始化 2)堆的销毁 3)堆的插入 4&#xf…

【0基础敲代码】如何使用使用SeaFile搭建私有云盘并公网访问

目录 1. 前言 2. SeaFile云盘设置 2.1 Owncould的安装环境设置 2.2 SeaFile下载安装 2.3 SeaFile的配置 3. cpolar内网穿透 3.1 Cpolar下载安装 3.2 Cpolar的注册 3.3 Cpolar云端设置 3.4 Cpolar本地设置 4. 公网访问测试 5. 结语 1. 前言 现在我们身边的只能设备…

VsCode SSH远程连接服务器【内网穿透公网连接】

文章目录1.前言2.VS code的安装和设置2.1 VS code的下载安装2.2 OpenSSH的启用2.3 为VS code配置ssh2.4 局域网内测试VS code的ssh连接2.5 Cpolar下载安装3.Cpolar端口设置3.1 Cpolar云端设置3.2 Cpolar本地设置4.公网访问测试5.结语1.前言 记得笔者小时候看电视,看…

Thinkphp常见漏洞利用

一、基础知识 1.ThinkPHP简介: ThinkPHP是一个开源,快速、简单的轻量级国产PHP开发框架,诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP。使用面向对象的开发结构和MVC模式,融合了Struts的思想和T…

【创建者模式】建造者模式

文章目录1、简介2、结构3、实现3.1、需求场景3.2、产品类3.3、抽象建造者类3.4、具体建造者类3.5、指挥者类3.6、测试类3.7、演示结果4、应用场景5、实操举例6、优缺点分析7、抽象工厂模式区别1、简介 建造者模式(Builder Pattern)旨在将一个复杂对象的构建与表示分离&#xf…

SpringCloud:ElasticSearch之索引库操作

ElasticSearch索引库就类似数据库表,mapping映射就类似表的结构。 我们要向ElasticSearch中存储数据,必须先创建“库”和“表”。 1.mapping映射属性 mapping是对索引库中文档的约束,常见的mapping属性包括: type:…

Hyperledger Fabric 2.2版本环境搭建

前言 部署环境: CentOS7.9 提前安装好以下工具 git客户端golangdockerdocker-composecurl工具 以下是个人使用的版本 git: 2.39.2golang: 1.18.6docker: 23.0.3dockkekr-compose: v2.17.2curl: 7.29.0 官方文档参考链接:跳转链接,不同的版本对应的官…