《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

相关文章

Windows下C++使用SQLitede的操作过程

《Windows下C++使用SQLitede的操作过程》本文介绍了Windows下C++使用SQLite的安装配置、CppSQLite库封装优势、核心功能(如数据库连接、事务管理)、跨平台支持及性能优... 目录Windows下C++使用SQLite1、安装2、代码示例CppSQLite:C++轻松操作SQ

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

java对接海康摄像头的完整步骤记录

《java对接海康摄像头的完整步骤记录》在Java中调用海康威视摄像头通常需要使用海康威视提供的SDK,下面这篇文章主要给大家介绍了关于java对接海康摄像头的完整步骤,文中通过代码介绍的非常详细,需... 目录一、开发环境准备二、实现Java调用设备接口(一)加载动态链接库(二)结构体、接口重定义1.类型