本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P11 设置加入游戏会话(Setup for Joining Sessions)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。
文章目录
- P11 设置加入游戏会话(Setup for Joining Sessions
- 11.1 创建查找和加入游戏会话的函数
- 11.2 进行测试
- 11.3 Summary
P11 设置加入游戏会话(Setup for Joining Sessions
本节课将在上节课《P10 创建会话(Creating A Session)》 代码的基础上,继续创建一个函数 “JoinGameSession()” 用以查找和加入已创建的游戏会话,然后创建一个查找会话完成的委托,并进行查找会话的设置。

11.1 创建查找和加入游戏会话的函数
-
添加代码到 “
MenuSystemcharacter.h” 的类 “AMenuSystemCharacter” 中,定义委托FindSessionsCompleteDelegate、加入游戏会话函数JoinGameSession()以及委托的回调函数OnFindSessionComplete():...UCLASS(config=Game) class AMenuSystemCharacter : public ACharacter {...protected:UFUNCTION(BlueprintCallable)void CreateGameSession(); // 创建游戏会话/* P11 设置加入游戏会话(Setup for Joining Sessions)*/UFUNCTION(BlueprintCallable)void JoinGameSession(); // 加入游戏会话/* P11 设置加入游戏会话(Setup for Joining Sessions)*/void OnCreateSessionComplete(FName SessionName, bool bWasSuccessful); // 委托 CreateSessionCompleteDelegate 的回调函数/* P11 设置加入游戏会话(Setup for Joining Sessions)*/void OnFindSessionsComplete(bool bWasSuccessful); // 委托 FindSessionCompleteDelegate 的回调函数/* P11 设置加入游戏会话(Setup for Joining Sessions)*/private:// 类 FOnCreateSessionCompleteDelegate 在 UE 5.0 和 5.1 版本的头文件 "Interfaces/OnlineSessionInterface.h" 中声明// 而 5.2 和 5.3 版本的头文件 "Interfaces/OnlineSessionDelegates.h" 中声明FOnCreateSessionCompleteDelegate CreateSessionCompleteDelegate; // 会话创建完成委托/* P11 设置加入游戏会话(Setup for Joining Sessions)*/FOnFindSessionsCompleteDelegate FindSessionsCompleteDelegate; // 会话查找完成委托TSharedPtr<FOnlineSessionSearch> SessionSearch; // 会话查找智能指针/* P11 设置加入游戏会话(Setup for Joining Sessions)*/ }; -
在 “
MenuSystemcharacter.cpp” 构造函数 “AMenuSystemCharacter::AMenuSystemCharacter()” 中为委托 “FindSessionsCompleteDelegate” 绑定回调函数 “OnFindSessionsComplete()” 并补充加入游戏会话函数JoinGameSession()的定义。... /* P11 设置加入游戏会话(Setup for Joining Sessions)*/ AMenuSystemCharacter::AMenuSystemCharacter(): // 为委托绑定回调函数CreateSessionCompleteDelegate(FOnCreateSessionCompleteDelegate::CreateUObject(this, &ThisClass::OnCreateSessionComplete)),FindSessionsCompleteDelegate(FOnFindSessionsCompleteDelegate::CreateUObject(this, &ThisClass::OnFindSessionsComplete)) /* P11 设置加入游戏会话(Setup for Joining Sessions)*/ {...}.../* P11 设置加入游戏会话(Setup for Joining Sessions)*/ void AMenuSystemCharacter::JoinGameSession() {// 查找游戏会话if (!OnlineSessionInterface.IsValid()) { // 检查在线会话接口是否有效return;}OnlineSessionInterface->AddOnFindSessionsCompleteDelegate_Handle(FindSessionsCompleteDelegate); // 添加委托到会话接口的委托列表// TSharedPtr<FOnlineSessionSearch> SessionSearch = MakeShareable(new FOnlineSessionSearch()); // 创建会话查找智能指针,利用函数 MakeShareable 初始化SessionSearch = MakeShareable(new FOnlineSessionSearch()); // 利用函数 MakeShareable 初始化会话查找智能指针。// 由于在回调函数中 OnFindSessionsComplete() 还要访问该变量,// 因此直接在 MenuSystemcharacter.h 中定义 SessionSearch 为 AMenuSystemCharacter 类的私有成员变量SessionSearch->MaxSearchResults = 10000; // 会话搜索设置:最大搜索结果数,尽量设置成较高的数字SessionSearch->bIsLanQuery = false; // 会话搜索设置:不使用 LAN 进行查询SessionSearch->QuerySettings.Set(SEARCH_PRESENCE, true, EOnlineComparisonOp::Equals); // 会话搜索设置:查询设置,确保任何查找到的会话都使用了 presenceconst ULocalPlayer* LocalPlayer = GetWorld()->GetFirstLocalPlayerFromController(); //获取本地玩家指针// 第一个输入参数类型为 const FUniqueNetId &SearchingPlayerId;// 第二个输入参数类型为 const TSharedRef<FOnlineSessionSearch> &SearchSettings, OnlineSessionInterface->FindSessions(*LocalPlayer->GetPreferredUniqueNetId(), SessionSearch.ToSharedRef()); // 使用 ToSharedRef() 成员函数获取 SessionSearch 共享指针引用(TSharedRef) } /* P11 设置加入游戏会话(Setup for Joining Sessions)*/... -
继续在 “
MenuSystemcharacter.cpp” 构造函数 “AMenuSystemCharacter::AMenuSystemCharacter()” 中完成回调函数OnFindSessionsComplete()的定义。/* P11 设置加入游戏会话(Setup for Joining Sessions)*/ void AMenuSystemCharacter::OnFindSessionsComplete(bool bWasSuccessful) {for (auto Result : SessionSearch->SearchResults) { // 遍历游戏会话搜索结果FString Id = Result.GetSessionIdStr();FString User = Result.Session.OwningUserName;if (GEngine) {GEngine->AddOnScreenDebugMessage( // 添加调试信息到屏幕上-1, // 使用 -1 不会覆盖前面的调试信息15.f, // 调试信息的显示时间FColor::Cyan, // 字体颜色FString::Printf(TEXT("Id: %s, User: %s!"), *Id, *User) // 打印消息);}} } /* P11 设置加入游戏会话(Setup for Joining Sessions)*/ -
进行实时编译,编译成功后打开 “
BP_ThirdPersonCharacter” 蓝图编辑器,绘制如下蓝图,编译、保存。

11.2 进行测试
- 将项目打包之后发送到另一台设备上。在设备 1 上运行游戏(保证 Steam 已经运行),按下数字键 “1”,屏幕左上角红色字体显示会话的名称 “
Game Session” ,说明设备 1 创建会话成功。

- 在设备 2 上运行游戏(保证 Steam 已经运行且登录的账户与设备1 上登录的账号不同),按下数字键 “2”,屏幕左上角蓝绿色字体显示设备 1 上登录到 Steam 的 ID 和用户名,说明设备 2 找到并加入了设备 1 创建的会话中。

11.3 Summary
本节课创建了一个加入会话的函数 JoinGameSession(),接着利用函数 “FOnFindSessionsCompleteDelegate” 创建委托,接着创建一个绑定到该委托的回调函数 “OnFindSessionsComplete()”,访问会话接口并添加该委托到委托列表中;然后创建一个会话搜索智能指针类型(指向会话搜索对象 FOnlineSearch)的变量 SessionSearch,通过访问其成员变量,可以进行会话搜索设置和遍历会话搜索结果;最后在两台设备上登录两个不同的 Steam 账号,以进行创建会话和搜索会话测试。
