本文为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); // 会话搜索设置:查询设置,确保任何查找到的会话都使用了 presence const 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 账号,以进行创建会话和搜索会话测试。