《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);	// 会话搜索设置:查询设置,确保任何查找到的会话都使用了 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)*/
    
    ...
    
  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 账号,以进行创建会话和搜索会话测试。
在这里插入图片描述


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/383655.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python远程控制工具的使用

本节我们对所编写的远程控制工具的功能进行测试。首先开启主控端程序&#xff0c; 如下所示&#xff1a; 接下来打开被控端程序。当被控端打开时&#xff0c;主控端会收到被控端的连接请 求。 开启被控端程序&#xff1a; 主控端接收到连接请求并显示被控端主机的信息&#xff…

MySQL-----DCL基础操作

▶ DCL简介 DCL英文全称是Data ControlLanguage(数据控制语言)&#xff0c;用来管理数据库用户、控制数据库的访问权限。 DCL--管理用户 ▶ 查询用户 use mysql; select * from user; ▶ 创建用户 ▶ 语法 create user 用户名主机名 identified by 密码 设置为在任意主机上访问…

Z-Stack一直卡在HAL_BOARD_INIT();

原因是Debugger没有配置好&#xff0c;因为默认是Simulator&#xff0c;不是TI的驱动&#xff0c;所以仿真出现一直卡在 HAL_BOARD_INIT(); 的情况&#xff0c;解决方法就是将Simulator改为Texas Instruments 改成下面的样子

MySQL篇----第二十篇

系列文章目录 文章目录 系列文章目录前言一、NULL 是什么意思二、主键、外键和索引的区别?三、你可以用什么来确保表格里的字段只接受特定范围里的值?四、说说对 SQL 语句优化有哪些方法?(选择几条)前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍…

Educational Codeforces Round 135 (Rated for Div. 2)C. Digital Logarithm(思维)

文章目录 题目链接题意题解代码 题目链接 C. Digital Logarithm 题意 给两个长度位 n n n的数组 a a a、 b b b&#xff0c;一个操作 f f f 定义操作 f f f为&#xff0c; a [ i ] f ( a [ i ] ) a [ i ] a[i]f(a[i])a[i] a[i]f(a[i])a[i]的位数 求最少多少次操作可以使 …

单片机学习笔记---串口向电脑发送数据电脑通过串口控制LED

目录 串口向电脑发送数据 每隔一秒串口就发送一个递增的数给电脑 电脑通过串口控制LED 波特率的具体计算 HEX模式和文本模式 前两节是本节的理论基础&#xff0c;这节开始代码演示&#xff01; 串口向电脑发送数据 接下来先开始演示一下串口单向发送一个数字给电脑&…

【Git】上传本地文件到Git(以Windows环境为例)

Git 的下载参考&#xff1a;Git 安装及配置 一、Git 上传的整体流程 1、工作区 > 本地仓库 将本地文件上传到Git&#xff0c;需要先上传到本地仓库&#xff0c;然后再上传到远程仓库。要上传文件到本地仓库&#xff0c;不是直接拷贝进去的&#xff0c;而是需要通过命令一步…

2024-02-11 Unity 编辑器开发之编辑器拓展2 —— 自定义窗口

文章目录 1 创建窗口类2 显示窗口3 窗口事件回调函数4 窗口中常用的生命周期函数5 编辑器窗口类中的常用成员6 小结 1 创建窗口类 ​ 当想为 Unity 拓展一个自定义窗口时&#xff0c;只需实现继承 EditorWindow 的类即可&#xff0c;并在该类的 OnGUI 函数中编写面板控件相关的…

QT入门-信号与槽

1.QT基本框架 #include "myWindow.h"#include <QApplication>int main(int argc, char *argv[]) {QApplication a(argc, argv);myWindow w;w.show();return a.exec(); } QApplicata&#xff1a;应用程序对象&#xff0c;必须有且只能有一个 Qwidget&#xff1…

过河卒(洛谷)

题目 原题 题目描述 棋盘上 A A A 点有一个过河卒&#xff0c;需要走到目标 B B B 点。卒行走的规则&#xff1a;可以向下、或者向右。同时在棋盘上 C C C 点有一个对方的马&#xff0c;该马所在的点和所有跳跃一步可达的点称为对方马的控制点。因此称之为“马拦过河卒”。…

3秒实现无痛基于Stable Diffusion WebUI安装ComfyUI!无需重复安装环境!无需重复下载模型!安装教程

标题略有夸张的表达了接下来这一套确实很简单&#xff0c;相较于直接下载或者通过秋叶包更新而言。大大节省磁盘空间&#xff0c;和下载时间。 这篇教程不需要你有&#xff1a; 代码基础。都是复制粘贴就完事。魔法。 这篇教程默认你已经有&#xff1a; 1. 本地能够正常使用…

汽车出租管理系统

文章目录 汽车出租管理系统一、系统演示二、项目介绍三、系统部分功能截图四、部分代码展示五、底部获取项目源码&#xff08;9.9&#xffe5;带走&#xff09; 汽车出租管理系统 一、系统演示 汽车租赁系统 二、项目介绍 语言&#xff1a;java 框架&#xff1a;SpringBoot、…

【2024年数据】67个“绿色金融”主题DID政策汇总(已去重)

DID”发文趋势和主题分布 数据来源&#xff1a;中国知网、各期刊官网 时间跨度&#xff1a;2017-2024年 数据范围&#xff1a;中国各省 数据指标&#xff1a; 序号 用于构建DID的政策 文献标题 1 “宽带中国” 数字技术创新与中国企业高质量发展——来自企业数字专利的证据…

陶陶摘苹果C++

题目&#xff1a; 代码&#xff1a; #include<iostream> using namespace std; int main(){//一、分析问题//已知&#xff1a;10 个苹果到地面的高度a[10],陶陶把手伸直的时候能够达到的最大高度height//未知&#xff1a;陶陶能够摘到的苹果的数目sum。//关系&#xff…

ncc匹配提速总结

我们ncc最原始的匹配方法是&#xff1a;学习模板w*h个像素都要带入ncc公式计算 第一种提速&#xff0c;学习模板是w*h&#xff0c;而我们支取其中的w/2*h/2,匹配窗口同理&#xff0c;计算量只有1/4。 另外一种因为ncc是线性匹配&#xff0c;我们在这上面也做了文章&#xff0…

ROS URDF、rviz、gazebo(1)

文章目录 1.URDF优化_xacro:1.1.xacro语法&#xff1a;1.2.xacro之launch集成&#xff1a; 2.arbotix控制机器人运动:2.1.编写arbotix配置文件&#xff1a;2.2.配置launch文件&#xff1a;2.3.向话题发布信息&#xff1a; 3.URDF集成gazebo&#xff1a;3.1.创建功能包并导入相关…

专业140+总分410+华南理工大学811信号与系统考研经验华工电子信息与通信,真题,大纲,参考书。

23考研已经落幕&#xff0c;我也成功的上岸华工&#xff0c;回首这一年多的历程&#xff0c;也是有一些经验想和大家分享一下。 首先说一下个人情况&#xff0c;本科211&#xff0c;初试成绩400分。专业课140。 整体时间安排 对于考研&#xff0c;很重要的一环就是时间安排&…

C语言--------数据在内存中的存储

1.整数在内存中的存储 整数在内存是以补码的形式存在的&#xff1b; 整型家族包括char,int ,long long,short类型&#xff1b; 因为char类型是以ASCII值形式存在&#xff0c;所以也是整形家族&#xff1b; 这四种都包括signed,unsigned两种&#xff0c;即有符号和无符号&am…

中文GPTS使用秘籍,字节扣子Coze工作流使用全教程

大家好&#xff0c;我是斜杠君。今天和大家分享字节扣子Coze工作流创建和使用全教程&#xff0c;手把手教会你。 首先我们先来看一下如何创建一个工作流。 我们以创建这样一个工作流为例。这个工作流程的作用是&#xff1a;把用户输入的内容通过头条接口查询信息&#xff0c;把…

算法沉淀——位运算(leetcode真题剖析)

算法沉淀——位运算 常用位运算总结1.基础位运算2.确定一个数中第x位是0还是13.将一个数的第x位改成14.将一个数的第x位改成05.位图6.提取一个数最右边的17.删掉一个数最右边的18.异或运算9.基础例题 力扣题目讲解01.面试题 01.01. 判定字符是否唯一02.丢失的数字03.两整数之和…