本文為B站系列教學(xué)視頻 《UE5_C++多人TPS完整教程》 —— 《P16 會(huì)話接口委托(Session Interface Delegates)》 的學(xué)習(xí)筆記,該系列教學(xué)視頻為 Udemy 課程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻譯版,UP主(也是譯者)為 游戲引擎能吃么。
P16 會(huì)話接口委托
本節(jié)課我們將向新創(chuàng)建的子系統(tǒng)添加會(huì)話接口函數(shù)、委托及與其綁定的回調(diào)函數(shù)、委托句柄(保存委托,以便在委托完成時(shí)能將其移出委托列表)。
16.1 會(huì)話接口函數(shù)及委托句柄
-
《P7 在線會(huì)話控制(Online Sessions)》 中曾提到,一個(gè)典型的會(huì)話 生命周期(Lifetime)包括會(huì)話由需求創(chuàng)建、等待玩家加入、為每個(gè)加入的玩家注冊(cè)、會(huì)話開(kāi)始、進(jìn)行多人游戲、會(huì)話結(jié)束、取消玩家注冊(cè)、會(huì)話更新或銷毀。我們只需要 “
CreateSession()
”、“FindSessions()
”、“JoinSession()
”、“StartSession()
”、“DestroySession
” 這些會(huì)話接口函數(shù)即可實(shí)現(xiàn)上述生命周期。我們將在自己創(chuàng)建的子系統(tǒng)上定義這些函數(shù),同時(shí)創(chuàng)建委托及與其綁定的回調(diào)函數(shù)、委托句柄。 -
具體的步驟是:我們構(gòu)造委托并將回調(diào)函數(shù)綁定到委托上,使用對(duì)應(yīng)的 “
AddOn...CompleteDelegate_Handle()
” 函數(shù)(這里以 “AddOnCreateSessionCompleteDelegate_Handle()
” 函數(shù)為例)添加到委托列表的委托,然后定義一個(gè)委托句柄類型 “FDelegateHandle
” 的變量來(lái)保存添加到委托列表的委托,以便委托完成后使用 “ClearOn..CompleteDelegate_Handle()
” 函數(shù)(這里以 “ClearOnCreateSessionCompleteDelegate_Handle()
” 函數(shù)為例)將其移出委托列表。
16.2 定義與會(huì)話處理相關(guān)的函數(shù)
- 在 “
MultiplayerSessionsSubsystem.h
” 中定義會(huì)話接口函數(shù)、委托及將與其綁定的回調(diào)函數(shù)、委托句柄。UCLASS() class MULTIPLAYERSESSIONS_API UMultiplayerSessionsSubsystem : public UGameInstanceSubsystem { GENERATED_BODY() public: UMultiplayerSessionsSubsystem(); /* P16 會(huì)話接口委托(Session Interface Delegates)*/ // 菜單類將會(huì)調(diào)用以下會(huì)話接口函數(shù) void CreateSession(int32 NumpublicConnections, FString MatchType); // 創(chuàng)建游戲會(huì)話 void FindSessions(int32 MaxSearchResults); // 查找游戲會(huì)話 void JoinSession(const FOnlineSessionSearchResult& SessionResult); // 加入游戲會(huì)話 void DestroySession(); // 銷毀會(huì)話 void StartSession(); // 開(kāi)始會(huì)話 /* P16 會(huì)話接口委托(Session Interface Delegates)*/ protected: /* P16 會(huì)話接口委托(Session Interface Delegates)*/ // 為將要添加到委托列表的委托定義類內(nèi)部的回調(diào)函數(shù),不需要在類外調(diào)用 void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful); // 委托 CreateSessionCompleteDelegate 的回調(diào)函數(shù) void OnFindSessionsComplete(bool bWasSuccessful); // 委托 FindSessionCompleteDelegate 的回調(diào)函數(shù) void OnJoinSessionComplete(FName SessionName, EOnJoinSessionCompleteResult::Type Result); // 委托 JoinSessionCompleteDelegate 的回調(diào)函數(shù) void OnDestroySessionComplete(FName SessionName, bool bWasSuccessful); // 委托 DestroySessionCompleteDelegate 的回調(diào)函數(shù) void OnStartSessionComplete(FName SessionName, bool bWasSuccessful); // 委托 StartSessionCompleteDelegate 的回調(diào)函數(shù) /* P16 會(huì)話接口委托(Session Interface Delegates)*/ private: // 會(huì)話接口智能指針 IOnlineSessionPtr SessionInterface; // 添加頭文件 "Interfaces/OnlineSessionInterface.h" 后使用,更具可讀性 // TSharedPtr<class IOnlineSession, ESPMode::ThreadSafe> SessionInterface; // 使用 TSharedPtr 智能指針包裝器進(jìn)行聲明 /* P16 會(huì)話接口委托(Session Interface Delegates)*/ // 定義與會(huì)話接口函數(shù)相關(guān)的委托 FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate; // 會(huì)話創(chuàng)建完成委托 FOnFindSessionsCompleteDelegate FindSessionsCompleteDelegate; // 會(huì)話查找完成委托 FOnJoinSessionCompleteDelegate JoinSessionCompleteDelegate; // 會(huì)話加入完成委托 FOnDestroySessionCompleteDelegate DestroySessionCompleteDelegate; // 會(huì)話銷毀完成委托 FOnStartSessionCompleteDelegate StartSessionCompleteDelegate; // 會(huì)話開(kāi)始完成委托 // 定義委托句柄 FDelegateHandle CreateSessionCompleteDelegateHandle; // 會(huì)話創(chuàng)建完成委托句柄 FDelegateHandle FindSessionsCompleteDelegateHandle; // 會(huì)話查找完成委托句柄 FDelegateHandle JoinSessionCompleteDelegateHandle; // 會(huì)話加入完成委托句柄 FDelegateHandle DestroySessionCompleteDelegateHandle; // 會(huì)話銷毀完成委托句柄 FDelegateHandle StartSessionCompleteDelegateHandle; // 會(huì)話開(kāi)始完成委托句柄 /* P16 會(huì)話接口委托(Session Interface Delegates)*/ };
- 在 “
MultiplayerSessionsSubsystem.cpp
” 中將委托及與對(duì)應(yīng)的回調(diào)函數(shù)進(jìn)行綁定。UMultiplayerSessionsSubsystem::UMultiplayerSessionsSubsystem(): // 為委托綁定回調(diào)函數(shù) /* P16 會(huì)話接口委托(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 會(huì)話接口委托(Session Interface Delegates)*/ { IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // 獲取當(dāng)前的在線子系統(tǒng)指針 if (OnlineSubsystem) { // 如果當(dāng)前在線子系統(tǒng)有效 SessionInterface = OnlineSubsystem->GetSessionInterface(); // 獲取會(huì)話接口智能指針 } }
·文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-829722.html
16.3 Summary
本節(jié)課依照會(huì)話生命周期定義了與會(huì)話管理相關(guān)的在線接口函數(shù)、委托及其對(duì)應(yīng)的回調(diào)函數(shù),并將回調(diào)函數(shù)綁定到委托上,使用對(duì)應(yīng)的 “AddOn...CompleteDelegate_Handle()
” 函數(shù)添加到委托列表的委托,然后定義一個(gè)委托句柄類型 “FDelegateHandle
” 的變量來(lái)保存添加到委托列表的委托,以便委托完成后使用 “ClearOn..CompleteDelegate_Handle()
” 函數(shù)將其移出委托列表。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-829722.html
到了這里,關(guān)于《UE5_C++多人TPS完整教程》學(xué)習(xí)筆記15 ——《P16 會(huì)話接口委托(Session Interface Delegates)》的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!