《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 账号,以进行创建会话和搜索会话测试。
在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

阿里云服务器带宽计费模式是什么?怎么选择?

阿里云服务器带宽计费模式分为“按固定带宽”和“按使用流量”&#xff0c;有什么区别&#xff1f;按固定带宽是指直接购买多少M带宽&#xff0c;比如1M、5M、10M、100M等&#xff0c;阿里云直接分配用户所购买的带宽值&#xff0c;根据带宽大小先付费再使用&#xff1b;按使用…

leetcode(矩阵)74. 搜索二维矩阵(C++详细解释)DAY7

文章目录 1.题目示例提示 2.解答思路3.实现代码结果 4.总结 1.题目 给你一个满足下述两条属性的 m x n 整数矩阵&#xff1a; 每行中的整数从左到右按非严格递增顺序排列。每行的第一个整数大于前一行的最后一个整数。 给你一个整数 target &#xff0c;如果 target 在矩阵中…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(八)(4)

实验八&#xff1a;近似计算 练习四 1.自己设置一种计算欧拉常数近似值的方法&#xff0c;看你对欧拉常数的计算能精确到小数点后多少位&#xff1f; 从示例7的图8.5我们已经得知&#xff0c;只要求出每个小矩形中在函数y1/x以上的部分的面积之和&#xff0c;我们就可以得知…

【后端高频面试题--SpringBoot篇】

&#x1f680; 作者 &#xff1a;“码上有前” &#x1f680; 文章简介 &#xff1a;后端高频面试题 &#x1f680; 欢迎小伙伴们 点赞&#x1f44d;、收藏⭐、留言&#x1f4ac; 这里写目录标题 1.什么是SpringBoot&#xff1f;它的主要特点是什么&#xff1f;2.列举一些Spri…

【java】11:IDEA常用快捷键+包

1. IDEA 常用快捷键 删除当前行, 默认是 ctrl Y 自己配置 ctrl d复制当前行, 自己配置 ctrl alt 向下光标补全代码 alt /添加注释和取消注释 ctrl / 【第一次是添加注释&#xff0c;第二次是取消注释】导入该行需要的类 先配置 auto import , 然后使用 altenter 即可快速…

【leetcode热题100】子集 II

给你一个整数数组 nums &#xff0c;其中可能包含重复元素&#xff0c;请你返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。返回的解集中&#xff0c;子集可以按 任意顺序 排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,2] 输出…

极狐GitLab 使用阿里云作为 OmniAuth 身份验证 provider

使用阿里云作为 OmniAuth 身份验证 provider 您可以启用阿里云 OAuth 2.0 OmniAuth provider并使用您的阿里云账户登录极狐GitLab。 创建阿里云应用 登录阿里云平台&#xff0c;在上面创建一个应用。阿里云会生成一个 client ID and secret key 供您使用。 登录到阿里云平台…

模型 AARRR(获取、激活、留存、收益、推荐)

系列文章 主要是 分享 思维模型&#xff0c;涉及各个领域&#xff0c;重在提升认知。用户增长五环。 1 模型 AARRR(获取、激活、留存、收益、推荐)的应用 1.1 抖音的AARRR模型应用 抖音是一款非常成功的应用程序&#xff0c;它在用户获取、用户激活、用户留存、收入获取和用户…

C++新特性“CPU优化对齐”

哈喽 各位读者伙伴大家好 本篇文章讲一下C新特性 alignas&alignof 在这之前 我们大家应该先了解一下数据对齐的问题 什么是数据对齐问题呢&#xff1f; 以下是两个结构体在内存中的分布图: 为什么要数据对齐呢&#xff1f; 首先是CPU 电脑中的CPU&#xff08;单核或者多核…

mac docker 宿主机和容器间网络打通

动因 是这样&#xff0c;笔者最近满怀欣喜入手Docker&#xff0c;看着各种文章命令都是不断点头称道&#xff1a;“嗯嗯&#xff0c;不错不错”,在接下来终于准备大干一场的时候碰壁了&#xff0c;主要情况是说在Mac中跑了第一把的时候发现碰到&#xff0c;虚拟机和宿主机居然…

LV.23 D1 ARM体系结构概述 学习笔记

一、必须要了解的ARM知识点 1、ARM公司简介 ARM&#xff08;Advanced RISC Machines&#xff09;有三种含义&#xff1a; 它是一个公司的名称、它是一类微处理器的通称、它是一种技术的名称。 2、ARM处理器家族 早先经典处理器 包括ARM7、ARM9、ARM11家族。 Corte…

【Java从入门到精通】Java变量类型

Java 变量类型 在 Java 语言中&#xff0c;所有的变量在使用前必须声明。 声明变量的基本格式如下&#xff1a; type identifier [ value][, identifier [ value] ...] ; 格式说明&#xff1a; type -- 数据类型。identifier -- 是变量名&#xff0c;可以使用逗号 , 隔开…

python-分享篇-GUI界面开发-PyQt5-对QListWidget列表进行数据绑定

代码 # -*- coding: utf-8 -*-# Form implementation generated from reading ui file bindlist.ui # # Created by: PyQt5 UI code generator 5.11.3 # # WARNING! All changes made in this file will be lost! 对QListWidget列表进行数据绑定from PyQt5 import QtCore, QtG…

为什么总有人觉得前端很简单?尤其是水平半瓶水的人。

造成这个印象的原因很多&#xff0c;贝格前端工场结合自己的经验&#xff0c;为大家揭开这个谜底。低端的前端确实简单&#xff0c;但是高级阶段确实不简单。 缺乏深入了解&#xff1a; 有些人可能只是对前端开发有一些浅显的了解&#xff0c;没有深入研究过前端开发的技术和知…

车载电子电器架构 —— 电子电气系统车载功能子系统

车载电子电器架构 —— 电子电气系统车载功能子系统 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再挣扎,出门靠自己,…

数模.微分方程

或者可以建立一个是实时脚本&#xff0c;也可以转化成上图公式 solver只是一个代名词&#xff0c;代表的是后面七种函数的名字 百分之九十用ode45函数 注意df1是在另外一个文件里面 计算导弹追击问题没有记录&#xff0c;去文件找代码

板块一 Servlet编程:第二节 Servlet的实现与生命周期 来自【汤米尼克的JAVAEE全套教程专栏】

板块一 Servlet编程&#xff1a;第二节 Servlet的实现与生命周期 一、Servlet相关概念Serlvet的本质 二、中Web项目中实现Servlet规范&#xff08;1&#xff09;在普通的Java类中继承HttpServlet类&#xff08;2&#xff09;重写service方法编辑项目对外访问路径 二、Servlet工…

392. Is Subsequence(判断子序列)

题目描述 给定字符串 s 和 t &#xff0c;判断 s 是否为 t 的子序列。 字符串的一个子序列是原始字符串删除一些&#xff08;也可以不删除&#xff09;字符而不改变剩余字符相对位置形成的新字符串。&#xff08;例如&#xff0c;"ace"是"abcde"的一个子…

【AI大模型应用开发】【LangChain系列】6. LangChain的Callbacks模块:监控调试程序的重要手段

大家好&#xff0c;我是【同学小张】。持续学习&#xff0c;持续干货输出&#xff0c;关注我&#xff0c;跟我一起学AI大模型技能。 LangChain提供了一个回调系统&#xff0c;允许您挂接到LLM应用程序的各个阶段。这对于日志记录、监视、流式传输和其他任务非常有用。 0. Lang…

02.数据结构

一、链表 作用&#xff1a;用于写邻接表&#xff1b; 邻接表作用&#xff1a;用于存储图或树&#xff1b; 1、用数组模拟单链表 #include<iostream> using namespace std;const int N 100010;// head 表示头结点的下标 // e[i] 表示结点i的值 // ne[i] 表示结点i的ne…