《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 会话接口委托](#P16 会话接口委托)
  • [16.1 会话接口函数及委托句柄](#16.1 会话接口函数及委托句柄)
  • [16.2 定义与会话处理相关的函数](#16.2 定义与会话处理相关的函数)
  • [16.3 Summary](#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" 中定义会话接口函数、委托及将与其绑定的回调函数、委托句柄。

    cpp 复制代码
    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" 中将委托及与对应的回调函数进行绑定。

    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()" 函数将其移出委托列表。


相关推荐
爱coding的橙子14 分钟前
蓝桥杯备赛 Day16 单调数据结构
数据结构·c++·算法·蓝桥杯
wuqingshun31415929 分钟前
经典算法 约数之和
数据结构·c++·算法·蓝桥杯
溟洵31 分钟前
【C/C++算法】蓝桥杯之递归算法(如何编写想出递归写法)
c语言·c++·算法
努力的小钟1 小时前
Unreal Engine 高效数组复制用法详解
ue5·游戏引擎·虚幻
十五年专注C++开发1 小时前
QT 中的元对象系统(五):QMetaObject::invokeMethod的使用和实现原理
开发语言·数据结构·c++·qt·设计模式
熬夜学编程的小王1 小时前
【C++初阶篇】C++中c_str函数的全面解析
c语言·c++·c_str
一线灵2 小时前
跨平台游戏引擎 axmol-2.5.0 发布
c++·游戏引擎·wasm·axmol
渴望脱下狼皮的羊2 小时前
C++基础讲解
开发语言·c++·后端
同勉共进6 小时前
虚函数表里有什么?(二)——普通单继承下的虚函数表
c++·单继承·虚函数表·dynamic_cast·rtii
永恒迷星.by8 小时前
文件操作(c语言)
c语言·c++·算法·文件操作