赞
踩
本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P16 会话接口委托(Session Interface Delegates)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。
本节课我们将向新创建的子系统添加会话接口函数、委托及与其绑定的回调函数、委托句柄(保存委托,以便在委托完成时能将其移出委托列表)。
《P7 在线会话控制(Online Sessions)》 中曾提到,一个典型的会话 生命周期(Lifetime)包括会话由需求创建、等待玩家加入、为每个加入的玩家注册、会话开始、进行多人游戏、会话结束、取消玩家注册、会话更新或销毁。我们只需要 “CreateSession()
”、“FindSessions()
”、“JoinSession()
”、“StartSession()
”、“DestroySession
” 这些会话接口函数即可实现上述生命周期。我们将在自己创建的子系统上定义这些函数,同时创建委托及与其绑定的回调函数、委托句柄。
具体的步骤是:我们构造委托并将回调函数绑定到委托上,使用对应的 “AddOn...CompleteDelegate_Handle()
” 函数(这里以 “AddOnCreateSessionCompleteDelegate_Handle()
” 函数为例)添加到委托列表的委托,然后定义一个委托句柄类型 “FDelegateHandle
” 的变量来保存添加到委托列表的委托,以便委托完成后使用 “ClearOn..CompleteDelegate_Handle()
” 函数(这里以 “ClearOnCreateSessionCompleteDelegate_Handle()
” 函数为例)将其移出委托列表。
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)*/
};
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(); // 获取会话接口智能指针
}
}
·
本节课依照会话生命周期定义了与会话管理相关的在线接口函数、委托及其对应的回调函数,并将回调函数绑定到委托上,使用对应的 “AddOn...CompleteDelegate_Handle()
” 函数添加到委托列表的委托,然后定义一个委托句柄类型 “FDelegateHandle
” 的变量来保存添加到委托列表的委托,以便委托完成后使用 “ClearOn..CompleteDelegate_Handle()
” 函数将其移出委托列表。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。