《UE5_C++多人TPS完整教程》学习笔记10 ——《P11 设置加入游戏会话(Setup for Joining Sessions)》

本文主要是介绍《UE5_C++多人TPS完整教程》学习笔记10 ——《P11 设置加入游戏会话(Setup for Joining Sessions)》,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


本文为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 创建查找和加入游戏会话的函数

  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)*/
    };
    
  2. 在 “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)*/...
    
  3. 继续在 “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)*/
    
  4. 进行实时编译,编译成功后打开 “BP_ThirdPersonCharacter” 蓝图编辑器,绘制如下蓝图,编译、保存。
    在这里插入图片描述

11.2 进行测试

  1. 将项目打包之后发送到另一台设备上。在设备 1 上运行游戏(保证 Steam 已经运行),按下数字键 “1”,屏幕左上角红色字体显示会话的名称 “Game Session” ,说明设备 1 创建会话成功。
    在这里插入图片描述
  2. 在设备 2 上运行游戏(保证 Steam 已经运行且登录的账户与设备1 上登录的账号不同),按下数字键 “2”,屏幕左上角蓝绿色字体显示设备 1 上登录到 Steam 的 ID 和用户名,说明设备 2 找到并加入了设备 1 创建的会话中。
    在这里插入图片描述

11.3 Summary

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


这篇关于《UE5_C++多人TPS完整教程》学习笔记10 ——《P11 设置加入游戏会话(Setup for Joining Sessions)》的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/703249

相关文章

C++中RAII资源获取即初始化

《C++中RAII资源获取即初始化》RAII通过构造/析构自动管理资源生命周期,确保安全释放,本文就来介绍一下C++中的RAII技术及其应用,具有一定的参考价值,感兴趣的可以了解一下... 目录一、核心原理与机制二、标准库中的RAII实现三、自定义RAII类设计原则四、常见应用场景1. 内存管理2. 文件操

C++中零拷贝的多种实现方式

《C++中零拷贝的多种实现方式》本文主要介绍了C++中零拷贝的实现示例,旨在在减少数据在内存中的不必要复制,从而提高程序性能、降低内存使用并减少CPU消耗,零拷贝技术通过多种方式实现,下面就来了解一下... 目录一、C++中零拷贝技术的核心概念二、std::string_view 简介三、std::stri

C++高效内存池实现减少动态分配开销的解决方案

《C++高效内存池实现减少动态分配开销的解决方案》C++动态内存分配存在系统调用开销、碎片化和锁竞争等性能问题,内存池通过预分配、分块管理和缓存复用解决这些问题,下面就来了解一下... 目录一、C++内存分配的性能挑战二、内存池技术的核心原理三、主流内存池实现:TCMalloc与Jemalloc1. TCM

mtu设置多少网速最快? 路由器MTU设置最佳网速的技巧

《mtu设置多少网速最快?路由器MTU设置最佳网速的技巧》mtu设置多少网速最快?想要通过设置路由器mtu获得最佳网速,该怎么设置呢?下面我们就来看看路由器MTU设置最佳网速的技巧... 答:1500 MTU值指的是在网络传输中数据包的最大值,合理的设置MTU 值可以让网络更快!mtu设置可以优化不同的网

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

C++ 函数 strftime 和时间格式示例详解

《C++函数strftime和时间格式示例详解》strftime是C/C++标准库中用于格式化日期和时间的函数,定义在ctime头文件中,它将tm结构体中的时间信息转换为指定格式的字符串,是处理... 目录C++ 函数 strftipythonme 详解一、函数原型二、功能描述三、格式字符串说明四、返回值五

Nexus安装和启动的实现教程

《Nexus安装和启动的实现教程》:本文主要介绍Nexus安装和启动的实现教程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、Nexus下载二、Nexus安装和启动三、关闭Nexus总结一、Nexus下载官方下载链接:DownloadWindows系统根

MySQL 设置AUTO_INCREMENT 无效的问题解决

《MySQL设置AUTO_INCREMENT无效的问题解决》本文主要介绍了MySQL设置AUTO_INCREMENT无效的问题解决,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参... 目录快速设置mysql的auto_increment参数一、修改 AUTO_INCREMENT 的值。

C++作用域和标识符查找规则详解

《C++作用域和标识符查找规则详解》在C++中,作用域(Scope)和标识符查找(IdentifierLookup)是理解代码行为的重要概念,本文将详细介绍这些规则,并通过实例来说明它们的工作原理,需... 目录作用域标识符查找规则1. 普通查找(Ordinary Lookup)2. 限定查找(Qualif

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和