UE4/5多人游戏详解(三、创建会话,委托绑定回调函数)

news2024/11/26 1:59:53

目录

基础的创建

回调函数绑定到委托:

实现创建会话的函数createGameSession:

回调函数实现判断验证是否成功:

添加会话设置:

测试


基础的创建

[提示:中途如果有无法编译则删除Binaries,saved,Intermediate后重新加载编译,如果仍然错误,就可能是你写错了]

我们使用 创建会话后,Session Interface将会发送信息到Steam,Steam将会创建游戏会话之后Steam将会把信息发送回来,以便让我们知道创建会话的操作已经完成。

会话接口使用委托来做到这一点,会话接口定义了一组委托。

之前我讲过这个#include "Interfaces/OnlineSessionInterface.h"头文件可以放在第三人称的头文件之中:

所以这里我就将其放在头文件,不过在角色的头文件中,这个地方就需要更改为这个:

做一个函数用来创建会话

 

创建委托

 

委托创建之后,我们要创建一个回调函数,这个回调函数将会在成功创建会话后调用,所以要绑定委托广播信号触发时,每一个绑定在委托上的函数都将被触发。

网络会话使用了委托机制,创建和连接游戏需要发送信息。

也因此我们可以看看委托里面需要调用的传输:

因此我们创建的回调函数是这样的:

 

回调函数绑定到委托:

然后我们到构造函数中去进行初始化,将回调函数绑定到委托,这是虚幻的一种绑定方式:

实现创建会话的函数createGameSession:

第一步是检查和确保在线的会话是否有效:

在之后我们要添加#include "OnlineSessionSettings.h"的头文件:

然后:

回调函数实现判断验证是否成功:

 

添加会话设置:

代码:

void AMorePersonTestCharacter::createGameSession()
{
	//当按下1的时候使用

	//第一步:检查确保在线的会话是有效的:
	
	//判断当前的myOnlineSessionInterface是否无效
	if (!myOnlineSessionInterface.IsValid())
	{
		return;
	}
	//NAME_GameSession是一个全局变量,这里返回的是一个FName,将其赋予局部变量NowSession存储
	auto NowSession = myOnlineSessionInterface->GetNamedSession(NAME_GameSession);
	//判断是不是空指针,不是的话将这个会话销毁掉
	if (NowSession !=nullptr)
	{
		myOnlineSessionInterface->DestroySession(NAME_GameSession);
	}

	//第二步:

	//将myOnlineSessionInterface加入委托列表
	myOnlineSessionInterface->AddOnCreateSessionCompleteDelegate_Handle(CreateSessionCompleteDelegate);
	//TSharedPtr是非UObject的智能指针
	TSharedPtr<FOnlineSessionSettings> mySessionSettings = MakeShareable(new FOnlineSessionSettings());
	//bIsLANMatch:This game will be lan only and not be visible to external players1
	//意思是这个是局域网连接,外面看不见,所以这里用false;【因为我们想要互联网连接】
	mySessionSettings->bIsLANMatch=false;
	//NumPublicConnections :The number of publicly available connections advertised
	//意思是可连接数,这里设置为4
	mySessionSettings->NumPublicConnections = 4;
	//bAllowJoinInProgress : Whether joining in progress is allowed or not
	//意思是会话正在进行,允不允许玩家加入
	mySessionSettings->bAllowJoinInProgress = true;
	//bAllowJoinViaPresence :Whether joining via player presence is allowed or not
	//steam有一个叫状态的东西,这个打开是为了让我们的连接正常工作
	mySessionSettings->bAllowJoinViaPresence = true;
	//bShouldAdvertise :Whether this match is publicly advertised on the online service
	//该匹配是否在在线服务上公开宣传[让其他玩家找到这个会话]
	mySessionSettings->bShouldAdvertise = true;
	//bUsesPresence :Whether to display user presence information or not
	//显示用户状态,查找所在区域正在进行的会话
	mySessionSettings->bUsesPresence = true;
	//bUseLobbiesIfAvailable :Whether to prefer lobbies APls if the platform supports them
	//如果平台支持,是否选择大厅的API
	mySessionSettings->bUseLobbiesIfAvailable = true;
	//创建指向本地玩家的指针
	const ULocalPlayer* localPlayer = GetWorld()->GetFirstLocalPlayerFromController();
	//查看函数实现:创建会话需要的是一个网络ID(里面底层原因,所以加一个*),会话名字,在线会话设置对象(这里传入的不是指针,所以加一个*)
	myOnlineSessionInterface->CreateSession(*localPlayer->GetPreferredUniqueNetId(), NAME_GameSession, *mySessionSettings);

}

void AMorePersonTestCharacter::finishSessionCreate(FName sessionName, bool createSessionSuccessed)
{
	//判断是否创建成功
	if (createSessionSuccessed)
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Blue, FString::Printf(TEXT("Create Session Successed:%s"), *sessionName.ToString()));
		}
	}
	else//没有成功
	{
		if (GEngine)
		{
			GEngine->AddOnScreenDebugMessage(-1, 15, FColor::Red, FString(TEXT("Create Session Failed")));
		}
	}
}

测试

在蓝图中,用1键盘进行验证:

然后打包【记得打开steam】:

我按了3次,第一次成功,第二次失败,第三次成功。 

 

 

 

 

 

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

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

相关文章

倍增?最近公共祖先?——从定义到实现,帮你一步步吃掉它!

倍增&#xff1f;最近公共祖先&#xff1f;——从定义到实现&#xff0c;帮你一步步吃掉它&#xff01; 一、倍增倍增——翻倍的增长 倍增是一种思想&#xff0c;实际上的操作就是通过不断翻倍来缩短我们的处理时间&#xff1a; 它可以把线性级别的处理优化到指数级。 举个…

5.redis-哨兵模式

01-哨兵模式概述 如果master宕机, 我们该怎么办? ①关闭所有slave②选举新的master, 建立新的主从结构 存在的问题 ①关闭期间, 谁来提供数据服务②选举新master的标准是什么③原来的master恢复了怎么办 哨兵模式 sentinel是一个分布式系统&#xff0c;用于对主从结构中的每…

【多线程】Thread类

1. Java中如何进行多线程编程&#xff1f;线程是操作系统中的概念&#xff0c;操作系统内核实现了线程这样的机制&#xff0c;并且对用户层提供了一些 API 供用户使用(如 Linux 中的 pthread 库)。所以本身关于线程的操作&#xff0c;是依赖操作系统提供的的 API&#xff0c;而…

练习,异常,异常处理,try-catch,throws

package com.jshedu.homework_;/*** author Mr.jia* version 1.0*/ //匿名内部类 public class Homework04 {public static void main(String[] args) {Cellphone cellphone new Cellphone();//1.匿名内部类&#xff0c;同时也是一个对象/*new computer() {Overridepublic dou…

JavaClient With HDFS

序言 在使用Java创建连接HDFS的客户端时,可以设置很多参数,具体有哪些参数呢,只要是在部署HDFS服务中可以设置的参数,都是可以在连接的时候设置. 我没有去验证所有的配置是否都可以验证,只是推测cuiyaonan2000163.com 依据 创建HDFS的构造函数如下所示: 网上比较常用的是get…

gdb 跟踪调式core

自己编译的问题出现段错误: 编译:使用gdb调试core文件来查找程序中出现段错误的位置时,要注意的是可执行程序在编译的时候需要加上-g编译命令选项。 gdb调试core文件的步骤 gdb调试core文件的步骤常见的有如下几种,推荐第一种。 具体步骤一: (1)启动gdb,进入core文…

【剑指 offer】旋转数组的最小数字

✨个人主页&#xff1a;bit me&#x1f447; ✨当前专栏&#xff1a;算法训练营&#x1f447; 旋 转 数 组 的 最 小 数 字核心考点&#xff1a;数组理解&#xff0c;二分查找&#xff0c;临界条件 描述&#xff1a; 有一个长度为 n 的非降序数组&#xff0c;比如[1,2,3,4,5]…

ABAP 创建、修改、删除内部交货单(VL31N/VL32N)

一、干货 VL31N创建的BAPI&#xff1a; 1.GN_DELIVERY_CREATE 通用交货单使用的bapi&#xff0c;推荐使用 2.BAPI_DELIVERYPROCESSING_EXEC 简单&#xff0c;但是字段比较少 3.BBP_INB_DELIVERY_CREATE 听说有bug&#xff0c;我就没有使用这个了 VL32N修改/删除BAPI: BAPI_INB…

每日学术速递4.14

CV - 计算机视觉 | ML - 机器学习 | RL - 强化学习 | NLP 自然语言处理 Subjects: cs.CV 1.Deep RL at Scale: Sorting Waste in Office Buildings with a Fleet of Mobile Manipulators 标题&#xff1a;大规模深度强化学习&#xff1a;使用移动机械手对办公楼中的垃圾进行…

VS2022编译libui库

libui是一个 C 中简单且可移植(但并非不灵活)的 GUI 库,它使用每个平台原生的GUI技术进行绘制。 官网地址:链接 本文将使用VS2022编译libui库,操作系统为Windows10。 1. 下载源代码 首先在官网下载源代码,由于此代码不依赖第三库,故只需下载源代码即可进行编译。 我下…

R730服务器环境搭建(centos7、lanproxy、docker、k8s)

文章目录前言一、centos7安装1.制作u盘启动盘2.开始装系统&#xff1a;二、环境安装&#xff08;lanproxy、docker、k8s&#xff09;1.lanproxy安装2.docker安装&#xff08;如果通过k8sOfflineSetup安装k8s可以跳过这一步&#xff0c;因为会自动安装docker&#xff09;3.安装k…

安装 KeyShot 流程

| 安装 KeyShot 流程 KeyShot 安装程序将指导您完成安装过程。 在 Windows 上&#xff0c;安装过程会要求您考虑以下事项终用户协议 为使用计算机的所有人或仅为当前用户安装 KeyShot 安装文件夹的位置 资源文件夹的位置 ——资源文件夹包含许多可以与 KeyShot 一起使用的纹…

NSSCTF doublegame题解

运行一下&#xff0c;是一个贪吃蛇游戏 先玩一玩&#xff0c;蛇的移动速度太快了&#xff0c;玩不了 查壳 64位文件&#xff0c;无壳 进入IDA分析 发现这个EXE文件是开了程序基址随机化&#xff0c;就是每次用IDA打开指令的地址不一样 我们要想使用x64dbg和IDA的时候&#…

Docker的基本操作

文章目录一、 Docker的基本操作1.1 镜像1.1.1 介绍1.1.2 镜像操作1.2 容器1.2.1 介绍1.2.2 容器操作1.3 数据卷1.3 介绍1.3.2 数据卷操作一、 Docker的基本操作 1.1 镜像 1.1.1 介绍 在 Docker 中&#xff0c;镜像&#xff08;Image&#xff09;是一种轻量级、可移植的、可扩…

营销平台一站式集成 高效实现自动化

市面上广告投放渠道渠道那么多&#xff0c;图文、动图、短视频等广告形式也越来越多&#xff0c;许多企业都会有这些疑问&#xff1a; 「腾讯广告、百度营销、巨量引擎哪个广告渠道的客户适合我们公司&#xff1f;」 「这么多广告渠道&#xff0c;哪家的点击率、转化率比较高…

1.Antlr4-简介入门

1.简介: ANTLR v4是一款功能强大的语法分析器生成器&#xff0c;可以用来读取、处理、执行和转换结构化文本或二进制文件。它被广泛应用于学术界和工业界构建各种语言、工具和框架。 2 关键字&#xff1a; import, fragment, lexer, parser, grammar, returns, locals, throw…

运维——记一次接口超时的问题与解决方法(HttpException: Read timed out)

前言&#xff1a;近期,一个线上的项目,请求出现了大量接口超时的问题,找了几个小时原因,最终发现是因为数据库服务器的磁盘满了,在此记录一下寻找的过程以及发现的问题,以备后续参考。 环境&#xff1a; 项目服务器(CentOS 64-bit 7.9) OpenJDK 1.8.0_272 数据库服务器(CentO…

打怪升级之FPGA组成原理(LE部分)

FPGA芯片逻辑单元的原理 不论你使用哪一款FPGA芯片&#xff0c;其核心可编程逻辑单元都是从一段内存种按顺序读取执行并执行的过程。具体来说&#xff0c;FOGA芯片内部包括可编程逻辑块(LAB)、可配置输入输出单元(IOE)、时钟管理模块、嵌入式RAM(BRAN&#xff0c;在Cyclone IV…

【堆的使用】【dfs构建数】二叉树遍历

二叉树遍历方法一&#xff1a;方法二&#xff1a;利用堆的性质原题链接 方法一&#xff1a; 利用dfs构建树 因为这个前序遍历给了我们空的叶节点 所以我们可以只根据叶节点 构建树 abc##de#g##f### 构建图如下 我们根据前序 abc##de#g##f### 发现 dfs左子树 和 右子树 当…

mac系统下使用clion调试redis源码

获取源代码 有两种方式&#xff0c;第一种是从官网下载 Redis 源码压缩包&#xff0c;如图 1-1 所示。 图1-1 将压缩包解压得到一个文件夹。 第二种方式&#xff0c;通过 git clone 获取源码。 从 Github 上&#xff0c;使用 git clone https://github.com/redis/redis.git…