《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()” 函数将其移出委托列表。
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Uipath 实现Excel 文件合并

场景描述 某文件夹下有多个相同结构(标题列相同)的Excel 文件&#xff0c;需实现汇总到一个Excel文件。 常见场景有销售明细汇总&#xff0c;订单汇总等。 解决方案 对于非IT 人员则可使用Uipath 新式Excel活动&#xff0c;通过拖拉实现。也可以通过内存表或使用VB脚本&…

Web前端-移动web开发_rem布局

文章目录 移动web开发之rem布局1.0 rem基础1.1 rem单位(重点)1.2 em单位(了解)1.3 媒体查询什么是媒体查询媒体查询语法规范 1.4 less 基础维护css弊端Less 介绍Less安装Less 使用之变量使用node编译less的指令Less 编译 vocode Less 插件Less 嵌套Less 运算Less中的Mixin混入L…

python-分享篇-GUI界面开发-PyQt5-禁止窗体显示最大化按钮及调整窗体大小

代码 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file nochange.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! 禁止窗体显示最大化按钮及调整窗体大小from PyQt5 import QtCo…

单体工程结构

本文主要说明下单体项目的工程结构如何设计&#xff0c;目前业界存在两种主流的应用工程结构&#xff1a;一种是阿里推出的《Java开发手册》中推荐的&#xff0c;另外一种是基于DDD(领域驱动设计)推荐的。下面我们来看下两种工程结构是怎样的。 一、 基于阿里《Java开发手册》…

cordic算法圆周系统计算sin、cos、平方和开根、atan、坐标系变换

cordic算法圆周系统计算sin、cos、平方和开根、atan 一、cordic圆周系统旋转模式和向量模式1.1 旋转模式1.2 向量模式 二、一些需要考虑的事项2.1角度范围2.2输入正负2.3关于迭代精度2.4坐标系旋转 参考文献&#xff1a; 若想计算 s i n sin sin、 c o s cos cos、 x 2 y 2 \s…

CTFshow web(php文件上传155-158)

web155 老样子&#xff0c;还是那个后端检测。 知识点&#xff1a; auto_append_file 是 PHP 配置选项之一&#xff0c;在 PHP 脚本执行结束后自动追加执行指定的文件。 当 auto_append_file 配置被设置为一个文件路径时&#xff0c;PHP 将在执行完脚本文件的所有代码后&…

LeetCode Python - 16.最接近的三数之和

目录 题目答案运行结果 题目 给你一个长度为 n 的整数数组 nums 和 一个目标值 target。请你从 nums 中选出三个整数&#xff0c;使它们的和与 target 最接近。 返回这三个数的和。 假定每组输入只存在恰好一个解。 示例 1&#xff1a; 输入&#xff1a;nums [-1,2,1,-4],…

双链表简介

一.双链表 这里简单的介绍一下双链表&#xff0c;双链表也是和单链表是一种类型的结构&#xff0c;但是也有些许不同&#xff0c;其中不同的地方在于&#xff0c;双链表多了一个可以存储上一个单元的地址&#xff0c;并且是循环的链表&#xff0c;而且还增加了一个哨兵位&…

C语言—简单的if语句

1.输入你的身高和体重&#xff0c;测试你的健康状况。 计算bmi的值&#xff0c; bmi &#xff08;体重/身高的平方) 如果bmi 小于18.5&#xff0c;则显示“偏瘦&#xff0c;注意加强营养” 如果bmi 在18.…

网络原理(3)--以太网协议,DNS

&#x1f495;"Echo"&#x1f495; 作者&#xff1a;Mylvzi 文章主要内容&#xff1a;网络原理(3)–以太网协议,DNS 在网络原理(2)中介绍了网络层中的一个重要的协议–ip协议,网络层关注的通信时的起点和终点,而数据链路层更加"底层"一些,关注的是传输过程…

如何在极低成本硬件上落地人工智能算法 —— 分布式AI

一、背景 分布式AI的发展前景非常广阔&#xff0c;随着5G、6G等高速网络通信技术的普及和边缘计算能力的提升&#xff0c;以及AI算法和硬件的不断优化进步&#xff0c;分布式AI将在多个领域展现出强大的应用潜力和市场价值&#xff1a; 1. **物联网&#xff08;IoT&#xff0…

Proteus -模拟串口被关闭后怎样打开

Proteus -模拟串口被关闭后怎样打开 点击恢复弹出窗口&#xff0c;即可重新打开