《UE5_C++多人TPS完整教程》学习笔记15 ——《P16 会话接口委托(Session Interface Delegates)》

本文主要是介绍《UE5_C++多人TPS完整教程》学习笔记15 ——《P16 会话接口委托(Session Interface Delegates)》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P16 会话接口委托(Session Interface Delegates)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。


文章目录

  • P16 会话接口委托
  • 16.1 会话接口函数及委托句柄
  • 16.2 定义与会话处理相关的函数
  • 16.3 Summary


P16 会话接口委托

本节课我们将向新创建的子系统添加会话接口函数、委托及与其绑定的回调函数、委托句柄(保存委托,以便在委托完成时能将其移出委托列表)。
在这里插入图片描述


16.1 会话接口函数及委托句柄

  1. 《P7 在线会话控制(Online Sessions)》 中曾提到,一个典型的会话 生命周期Lifetime)包括会话由需求创建、等待玩家加入、为每个加入的玩家注册、会话开始、进行多人游戏、会话结束、取消玩家注册、会话更新或销毁。我们只需要 “CreateSession()”、“FindSessions()”、“JoinSession()”、“StartSession()”、“DestroySession” 这些会话接口函数即可实现上述生命周期。我们将在自己创建的子系统上定义这些函数,同时创建委托及与其绑定的回调函数、委托句柄。
    在这里插入图片描述

  2. 具体的步骤是:我们构造委托并将回调函数绑定到委托上,使用对应的 “AddOn...CompleteDelegate_Handle()” 函数(这里以 “AddOnCreateSessionCompleteDelegate_Handle()” 函数为例)添加到委托列表的委托,然后定义一个委托句柄类型 “FDelegateHandle” 的变量来保存添加到委托列表的委托,以便委托完成后使用 “ClearOn..CompleteDelegate_Handle()” 函数(这里以 “ClearOnCreateSessionCompleteDelegate_Handle()” 函数为例)将其移出委托列表。
    在这里插入图片描述

16.2 定义与会话处理相关的函数

  1. 在 “MultiplayerSessionsSubsystem.h” 中定义会话接口函数、委托及将与其绑定的回调函数、委托句柄。
    UCLASS()
    class MULTIPLAYERSESSIONS_API UMultiplayerSessionsSubsystem : public UGameInstanceSubsystem
    {GENERATED_BODY()public:UMultiplayerSessionsSubsystem();/* P16 会话接口委托(Session Interface Delegates)*/// 菜单类将会调用以下会话接口函数void CreateSession(int32 NumpublicConnections, FString MatchType);	// 创建游戏会话void FindSessions(int32 MaxSearchResults);							// 查找游戏会话void JoinSession(const FOnlineSessionSearchResult& SessionResult);	// 加入游戏会话void DestroySession();	// 销毁会话void StartSession();	// 开始会话/* P16 会话接口委托(Session Interface Delegates)*/protected:/* P16 会话接口委托(Session Interface Delegates)*/// 为将要添加到委托列表的委托定义类内部的回调函数,不需要在类外调用void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful);	// 委托 CreateSessionCompleteDelegate 的回调函数void OnFindSessionsComplete(bool bWasSuccessful);						// 委托 FindSessionCompleteDelegate 的回调函数void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result);	// 委托 JoinSessionCompleteDelegate 的回调函数void OnDestroySessionComplete(FName SessionName, bool bWasSuccessful);	// 委托 DestroySessionCompleteDelegate 的回调函数void OnStartSessionComplete(FName SessionName, bool bWasSuccessful);	// 委托 StartSessionCompleteDelegate 的回调函数/* P16 会话接口委托(Session Interface Delegates)*/private:// 会话接口智能指针IOnlineSessionPtr SessionInterface;	// 添加头文件 "Interfaces/OnlineSessionInterface.h" 后使用,更具可读性// TSharedPtr<class IOnlineSession, ESPMode::ThreadSafe> SessionInterface;	// 使用 TSharedPtr 智能指针包装器进行声明/* P16 会话接口委托(Session Interface Delegates)*/// 定义与会话接口函数相关的委托FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate;		// 会话创建完成委托FOnFindSessionsCompleteDelegate FindSessionsCompleteDelegate;		// 会话查找完成委托FOnJoinSessionCompleteDelegate JoinSessionCompleteDelegate;			// 会话加入完成委托FOnDestroySessionCompleteDelegate DestroySessionCompleteDelegate;	// 会话销毁完成委托FOnStartSessionCompleteDelegate StartSessionCompleteDelegate;		// 会话开始完成委托// 定义委托句柄FDelegateHandle CreateSessionCompleteDelegateHandle;				// 会话创建完成委托句柄FDelegateHandle FindSessionsCompleteDelegateHandle;					// 会话查找完成委托句柄FDelegateHandle JoinSessionCompleteDelegateHandle;					// 会话加入完成委托句柄FDelegateHandle DestroySessionCompleteDelegateHandle;				// 会话销毁完成委托句柄FDelegateHandle StartSessionCompleteDelegateHandle;					// 会话开始完成委托句柄/* P16 会话接口委托(Session Interface Delegates)*/
    };
    
  2. 在 “MultiplayerSessionsSubsystem.cpp” 中将委托及与对应的回调函数进行绑定。
    UMultiplayerSessionsSubsystem::UMultiplayerSessionsSubsystem():	// 为委托绑定回调函数/* P16 会话接口委托(Session Interface Delegates)*/CreateSessionCompleteDelegate(FOnCreateSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnCreateSessionComplete)),FindSessionsCompleteDelegate(FOnFindSessionsCompleteDelegate::CreateUObject(this, &ThisClass::OnFindSessionsComplete)),JoinSessionCompleteDelegate(FOnJoinSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnJoinSessionComplete)),DestroySessionCompleteDelegate(FOnDestroySessionCompleteDelegate::CreateUObject(this, &ThisClass::OnDestroySessionComplete)),StartSessionCompleteDelegate(FOnStartSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnStartSessionComplete))/* P16 会话接口委托(Session Interface Delegates)*/
    {IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();			// 获取当前的在线子系统指针if (OnlineSubsystem) {													// 如果当前在线子系统有效SessionInterface = OnlineSubsystem->GetSessionInterface();	// 获取会话接口智能指针}
    }
    

·

16.3 Summary

本节课依照会话生命周期定义了与会话管理相关的在线接口函数、委托及其对应的回调函数,并将回调函数绑定到委托上,使用对应的 “AddOn...CompleteDelegate_Handle()” 函数添加到委托列表的委托,然后定义一个委托句柄类型 “FDelegateHandle” 的变量来保存添加到委托列表的委托,以便委托完成后使用 “ClearOn..CompleteDelegate_Handle()” 函数将其移出委托列表。
在这里插入图片描述


这篇关于《UE5_C++多人TPS完整教程》学习笔记15 ——《P16 会话接口委托(Session Interface Delegates)》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712028

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

SpringBoot整合OpenFeign的完整指南

《SpringBoot整合OpenFeign的完整指南》OpenFeign是由Netflix开发的一个声明式Web服务客户端,它使得编写HTTP客户端变得更加简单,本文为大家介绍了SpringBoot... 目录什么是OpenFeign环境准备创建 Spring Boot 项目添加依赖启用 OpenFeig

springboot使用Scheduling实现动态增删启停定时任务教程

《springboot使用Scheduling实现动态增删启停定时任务教程》:本文主要介绍springboot使用Scheduling实现动态增删启停定时任务教程,具有很好的参考价值,希望对大家有... 目录1、配置定时任务需要的线程池2、创建ScheduledFuture的包装类3、注册定时任务,增加、删

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

如何为Yarn配置国内源的详细教程

《如何为Yarn配置国内源的详细教程》在使用Yarn进行项目开发时,由于网络原因,直接使用官方源可能会导致下载速度慢或连接失败,配置国内源可以显著提高包的下载速度和稳定性,本文将详细介绍如何为Yarn... 目录一、查询当前使用的镜像源二、设置国内源1. 设置为淘宝镜像源2. 设置为其他国内源三、还原为官方

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

usb接口驱动异常问题常用解决方案

《usb接口驱动异常问题常用解决方案》当遇到USB接口驱动异常时,可以通过多种方法来解决,其中主要就包括重装USB控制器、禁用USB选择性暂停设置、更新或安装新的主板驱动等... usb接口驱动异常怎么办,USB接口驱动异常是常见问题,通常由驱动损坏、系统更新冲突、硬件故障或电源管理设置导致。以下是常用解决

Maven的使用和配置国内源的保姆级教程

《Maven的使用和配置国内源的保姆级教程》Maven是⼀个项目管理工具,基于POM(ProjectObjectModel,项目对象模型)的概念,Maven可以通过一小段描述信息来管理项目的构建,报告... 目录1. 什么是Maven?2.创建⼀个Maven项目3.Maven 核心功能4.使用Maven H

SpringBoot多数据源配置完整指南

《SpringBoot多数据源配置完整指南》在复杂的企业应用中,经常需要连接多个数据库,SpringBoot提供了灵活的多数据源配置方式,以下是详细的实现方案,需要的朋友可以参考下... 目录一、基础多数据源配置1. 添加依赖2. 配置多个数据源3. 配置数据源Bean二、JPA多数据源配置1. 配置主数据

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文