《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》
本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P9 访问 Steam(Acessing Steam)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。
文章目录
- P9 访问 Steam
- 9.1 访问在线子系统
- 9.2 打印在线子系统的名称
- 9.3 Summary
P9 访问 Steam
本节课将接着上节课 《P8 为项目配置 Steam(Configuring A Project for Steam)》 的内容,在项目配置好 Steam
平台在线子系统后,尝试访问 Steam
在线子系统,通过打印子系统到屏幕上以查看我们连接到哪个子系统上,同时也可以验证我们的配置是否成功。
9.1 访问在线子系统
-
打开 Visual Studio,在右侧解决方案资源管理器展开 “
/Games/MenuSystem/Source/MenuSystem/
”,打开 “MenuSystemcharacter.h
”,添加头文件 “OnlineSubsystem.h
”,继续添加代码到类 “AMenuSystemCharacter
” 中:...UCLASS(config=Game) class AMenuSystemCharacter : public ACharacter {GENERATED_BODY()...public:/* P9 访问 Steam(Acessing Steam)*/// 会话接口智能指针IOnlineSessionPtr OnlineSessionInterface;/* P9 访问 Steam(Acessing Steam)*/ };...
注意:
- 如果打开 Visual Studio 后在右侧解决方案资源管理器看到
MenuSystem (未找到)
,则需要在虚幻引擎中 “刷新 Visual Studio 项目”,然后重新打开。
- 如下图,添加的头文件代码
#include "OnlineSubsystem.h"
必须放在#include "MenuSystemCharacter.generated.h"
前面。
如果放在后面会报错。
- 如果打开 Visual Studio 后在右侧解决方案资源管理器看到
-
打开 “
MenuSystemcharacter.cpp
” ,添加代码到类 “AMenuSystemCharacter
” 的构造函数 “AMenuSystemCharacter::AMenuSystemCharacter()
” 中:AMenuSystemCharacter::AMenuSystemCharacter() {IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // 获取当前的在线子系统指针if (OnlineSubsystem) { // 如果当前在线子系统有效OnlineSessionInterface = OnlineSubsystem->GetSessionInterface(); // 获取会话接口智能指针} }
-
尝试进行编译,编译失败,Visual Studio 错误提示消息中包括 “E0349 没有与这些握作数匹配的“=" 运算符” 以及 “C2679 二元"=": 没有找到接受”InlineSessionPtr"类型的右择作数的运算符(没有可接受的转换)。
而视频中出现的错误如下:
使用实时编译出现错误 “UnrealEditor - MenuSystem.dll is not currently enabled for Live Coding”,解决方法参阅《UE5 C++报错:is not currently enabled for Live Coding》,或者也可以先使用离线编译。实时编译和离线编译的区别参阅 《UE5_C++多人TPS完整教程》学习笔记4 ——《P5 局域网连接(LAN Connection)》
如果按照 《UE5 C++报错:is not currently enabled for Live Coding》 重新生成项目文件后,出现错误提示 “MenuSystem could not be compiled. Try rebuilding from source manually.”,即虚幻引擎不能自动编译、打开编辑器窗口,则使用 Visual Studio 中打开 “MenuSystem.sln
”,在菜单栏中选择 “生成解决方案(B)” 进行离线编译,但需要先确保代码没有报错(也就是先按步骤 4 中修改好代码)。
-
这里提供两种解决方法:
① 直接添加头文件 “Interfaces/OnlineSessionInterface.h
” 即可,头文件中包含了 “IOnlineSessionPtr
” 的声明。
② 由于 “IOnlineSessionPtr
” 使用了 “typedef
” 关键字,它是一个指向 “IOnlineSession
” 的共享指针类型 “TsharedPtr
” 多线程安全版本的别名,因此在没有添加头文件 “Interfaces/OnlineSessionInterface.h
” 的情况下需要按照 “TSharedPtr
” 智能指针包装器(Smart pointer wrapper)声明变量:将代码改为 “TSharedPtr<class IOnlineSession, ESPMode::ThreadSafe> OnlineSessionInterface;
” 即可。共享指针类型 “TsharedPtr
” 的学习可以参阅虚幻引擎官方文档《虚幻智能指针库》、《共享指针》。
视频采用了第 ② 种解决方法。
使用智能指针的优点:
- 防止内存泄漏:共享引用不存在时,智能指针(弱指针除外)会自动删除对象。
- 弱引用:弱指针会中断引用循环并阻止悬挂指针。
- 可选择的线程安全:虚幻智能指针库包括线程安全代码,可跨线程管理引用计数。如无需线程安全,可用其换取更好性能。
- 运行时安全:共享引用从不为空,可固定随时取消引用。
- 授予意图:可轻松区分对象所有者和观察者。
- 内存:智能指针在64位下仅为C++指针大小的两倍(加上共享的16字节引用控制器)。唯一指针除外,其与C++指针大小相同。
线程安全:通常仅在单线程上访问智能指针的操作才是安全的。如需访问多线程,请使用智能指针类的线程安全版本:- TSharedPtr<T, ESPMode::ThreadSafe>
- TSharedRef<T, ESPMode::ThreadSafe>
- TWeakPtr<T, ESPMode::ThreadSafe>
- TSharedFromThis<T, ESPMode::ThreadSafe>
—— 虚幻引擎官方文档《虚幻智能指针库》
- 重新进行编译,编译成功。
9.2 打印在线子系统的名称
-
继续在 “
MenuSystemcharacter.cpp
” 构造函数 “AMenuSystemCharacter::AMenuSystemCharacter()
” 中添加打印子系统名称到屏幕上的代码。AMenuSystemCharacter::AMenuSystemCharacter() {IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get(); // 获取当前的在线子系统指针if (OnlineSubsystem) { // 如果当前在线子系统有效OnlineSessionInterface = OnlineSubsystem->GetSessionInterface(); // 获取会话接口智能指针if (GEngine) {GEngine->AddOnScreenDebugMessage( // 添加调试信息到屏幕上-1, // 使用 -1 不会覆盖前面的调试信息15.f, // 调试信息的显示时间FColor::Blue, // 字体颜色FString::Printf(TEXT("Found subsystem %s!"), *OnlineSubsystem->GetSubsystemName().ToString()) // 打印在线子系统的名称);}} }
调用全局变量
GEngine
指针调用函数AddOnScreenDebugMessage
节点,进行屏幕输出。void AddOnScreenDebugMessage {int32 Key,float TimeToDisplay,FColor Di splayColor,const FString & DebugMessage,bool bNewerOnTop,const FVector2D & TextScale }
Key = -1
时,则添加新的消息,不会覆盖旧有消息(当Key = -1
时,bNewerOnTop
有效,直接添加到队列最上层)Key != -1
时,则更新现有消息,效率更高。
—— 《虚幻引擎基础入门(C++) — 【日志输出篇 03】》
-
进行实时编译,编译成功。
如果采用离线编译出现视频中的如下错误,先关闭 Visual Studio,删除项目目录下
Binaries
文件夹,鼠标右键单击 “MenuSystem.uproject
”,在下拉菜单栏中选择 “Generate Visual Studio project files”,然后左键单击 “MenuSystem.uproject
”重构项目。
-
下载并安装
Steam
平台客户端(官方下载地址:https://store.steampowered.com/),然后注册账户进行登录。此过程可能需要科学上网,也可以下载Watt Tookit
(官方下载地址:https://steampp.net/) 加速。
-
在编辑器中播放游戏,无论切换到哪个网络模式,屏幕上显示的在线子系统名称都是 “NULL”。
-
将项目打包之后再运行游戏(保证
Steam
已经运行),可以看到屏幕上显示的在线子系统名称为Steam
,并且Steam
在右下角弹出通知。
9.3 Summary
本节课通过编写 C++ 代码尝试访问 Steam
在线子系统,通过打印子系统名称到屏幕上验证访问是否成功。
在 9.1 访问在线子系统 的 步骤 1 中使用函数 AddOnScreenDebugMessage()
进行屏幕消息输出时,若函数第一个入参 “int32 Key
” 为 -1 ,则添加新的消息,不会覆盖旧有消息(当 Key
为 -1 时,bNewerOnTop
有效,直接添加到队列最上层),若 Key
不为 -1 ,则更新现有消息。
在 步骤 3 中如果使用实时编译出现错误 “UnrealEditor - MenuSystem.dll is not currently enabled for Live Coding”,解决方法参阅《UE5 C++报错:is not currently enabled for Live Coding》,或者也可以先使用离线编译。如果按照这篇博文重新生成项目文件后,出现错误提示 “MenuSystem could not be compiled. Try rebuilding from source manually.”,使用 Visual Studio 中进行离线编译,但需要先按照 步骤 4 修改代码,保证代码没有报错。
本小节最关键的步骤在于声明 “IOnlineSessionPtr
” 变量需要按照 “TSharedPtr
” 智能指针包装器(Smart pointer wrapper)声明变量。共享指针类型 “TsharedPtr
” 的学习可以参阅虚幻引擎官方文档《虚幻智能指针库》、《共享指针》。
在 9.2 打印在线子系统的名称 的 步骤 2 中,进行编译时出现视频中的错误 “无法删除热重载文件…”,只需要删除项目目录下 Binaries
文件夹,重新生成项目文件、重构项目即可。
在 步骤 4 和 步骤 5 中,可以看到在 PIE 模式下无论切换任何网络模式打印出的在线子系统名称都是 “NULL
”;而将项目打包以后再次运行游戏,可以成功打印出在线子系统名称为 “Steam
”。
相关文章:

《UE5_C++多人TPS完整教程》学习笔记8 ——《P9 访问 Steam(Acessing Steam)》
本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P9 访问 Steam(Acessing Steam)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者&…...
缓存穿透问题与解决方案
引言 在分布式系统中,缓存技术被广泛应用以提高系统性能和响应速度。然而,缓存穿透是一个常见而严重的问题,特别是在面对大规模请求时。本文将深入探讨缓存穿透的原因、影响以及一些有效的解决方案,以确保系统在面对这一问…...

《Git 简易速速上手小册》第1章:Git 基础(2024 最新版)
文章目录 1.1 Git 简介:版本控制的演变1.1.1 基础知识讲解1.1.2 重点案例:协作开发流程优化案例:功能开发与分支策略 1.1.3 拓展案例 1:代码审查与合并1.1.4 拓展案例 2:冲突解决 1.2 安装和配置 Git:首次设…...
交易中的胜率和盈亏比估算
交易中的胜率和盈亏比估算 1.定义 胜率是指交易者在一定时间内成功交易的次数占总交易次数的比例。例如,如果交易者在10次交易中成功了6次,那么他的胜率就是60%。 盈亏比是指交易者每笔成功交易的盈利与每笔失败交易的亏损之间的比例。例如࿰…...
mysql RR、RC隔离级别实现原理
事务隔离级别实现过程 快照读(select语句) 获取事务自己版本号,即事务 ID获取 Read View 查询得到数据,然后 Read View 中事务版本号进行比较。如果不符合 Read View 可见性规则(看最新数据还是副本里的数据…...

c语言--指针数组(详解)
目录 一、什么是指针数组?二、指针数组模拟二维数组 一、什么是指针数组? 指针数组是指针还是数组? 我们类比一下,整型数组,是存放整型的数组,字符数组是存放字符的数组。 那指针数组呢?是存放…...
Elasticsearch单个索引数据量过大的优化
当Elasticsearch(ES)中的单个索引(index)的数据量变得过大时,可能会遇到性能下降、查询缓慢、管理困难等问题。为了优化和应对大索引的挑战,可以考虑以下策略: 1. 使用分片和副本 分片…...

Java安全 CC链1分析(Lazymap类)
Java安全 CC链1分析 前言CC链分析CC链1核心LazyMap类AnnotationInvocationHandler类 完整exp: 前言 在看这篇文章前,可以看下我的上一篇文章,了解下cc链1的核心与环境配置 Java安全 CC链1分析 前面我们已经讲过了CC链1的核心ChainedTransf…...

【lesson51】信号之信号处理
文章目录 信号处理可重入函数volatileSIGCHLD信号 信号处理 信号产生之后,信号可能无法被立即处理,一般在合适的时候处理。 1.在合适的时候处理(是什么时候?) 信号相关的数据字段都是在进程PCB内部。 而进程工作的状态…...

分享springboot框架的一个开源的本地开发部署教程(若依开源项目开发部署过程分享持续更新二开宝藏项目MySQL数据库版)
1首先介绍下若依项目: 若依是一个基于Spring Boot和Spring Cloud技术栈开发的多租户权限管理系统。该开源项目提供了一套完整的权限管理解决方案,包括用户管理、角色管理、菜单管理、部门管理、岗位管理等功能。 若依项目采用前后端分离的架构…...

leetcode:131.分割回文串
树形结构: 切割到字符串的尾部,就是叶子节点。 回溯算法三部曲: 1.递归的参数和返回值: 参数字符串s和startIndex切割线 2.确定终止条件: 当分割线到字符串末尾时到叶子节点,一种方案出现 3.单层搜索…...
Linux下的json-c
一、json-c库的安装(ubuntu) root用户运行以下命令: apt-get install libjson0-dev libjson0非root用户运行以下命令: sudo apt-get install libjson0-dev libjson0二、解析json数据 1. json_object json_object是JSON-C库中定义的一个结构体&#…...

[C#] 如何使用ScottPlot.WPF在WPF桌面程序中绘制图表
什么是ScottPlot.WPF? ScottPlot.WPF 是一个开源的数据可视化库,用于在 WPF 应用程序中创建高品质的绘图和图表。它是基于 ScottPlot 库的 WPF 版本,提供了简单易用的 API,使开发人员能够通过简单的代码创建各种类型的图表&#…...

如何修复Mac的“ kernel_task” CPU使用率过高的Bug?
当计算机开始缓慢运行时,这从来都不是一件有趣的事情,但是当您弄不清它为何如此缓慢时,甚至会变得更糟。如果您已经关闭了所有程序,并且Mac上的所有内容仍然感觉像是在糖蜜中移动,这可能是令人讨厌的kernel_task导致高…...

【NodeJS】006- API模块与会话控制介绍d
1.简介 1.1 接口是什么 接口是 前后端通信的桥梁 简单理解:一个接口就是 服务中的一个路由规则 ,根据请求响应结果 接口的英文单词是 API (Application Program Interface),所以有时也称之为 API 接口 这里的接口指的是『数据接口』&#…...

[UI5 常用控件] 08.Wizard,NavContainer
文章目录 前言1. Wizard1.1 基本结构1.2 属性1.2.1 Wizard:complete1.2.2 Wizard:finishButtonText1.2.3 Wizard:currentStep1.2.4 Wizard:backgroundDesign1.2.5 Wizard:enableBranching1.2.6 WizardStep:…...

EasyExcel分页上传数据
EasyExcel分页上传数据 一、实例 controller上传入口 PostMapping("/upload")ResponseBodyLog(title "导入工单", businessType BusinessType.IMPORT)public AjaxResult uploadFile(HttpServletRequest request, MultipartFile files) throws Exceptio…...

Spring Native 解放 JVM
一、Spring Native 是什么 Spring Native可以通过GraalVM将Spring应用程序编译成原生镜像,提供了一种新的方式来部署Spring应用。与Java虚拟机相比,原生镜像可以在许多场景下降低工作负载,包括微服务,函数式服务,非常…...
汇编的两道题
1.编写一个在显示器上显示一个笑脸字符的程序 看这段程序的结构,可以看出,每个代码段,带有segment的必须用ASSUME 来进行段分配。 PROG1 SEGMENT;PROG1段的开始ASSUME CS:PROG1;PROG1(自己命名的,叫啥都可以ÿ…...

Seurat - 聚类教程 (1)
设置 Seurat 对象 在本教程[1]中,我们将分析 10X Genomics 免费提供的外周血单核细胞 (PBMC) 数据集。在 Illumina NextSeq 500 上对 2,700 个单细胞进行了测序。可以在此处[2]找到原始数据。 我们首先读取数据。 Read10X() 函数从 10X 读取 cellranger 管道的输出&…...

UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...

Xshell远程连接Kali(默认 | 私钥)Note版
前言:xshell远程连接,私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...
DockerHub与私有镜像仓库在容器化中的应用与管理
哈喽,大家好,我是左手python! Docker Hub的应用与管理 Docker Hub的基本概念与使用方法 Docker Hub是Docker官方提供的一个公共镜像仓库,用户可以在其中找到各种操作系统、软件和应用的镜像。开发者可以通过Docker Hub轻松获取所…...
Leetcode 3577. Count the Number of Computer Unlocking Permutations
Leetcode 3577. Count the Number of Computer Unlocking Permutations 1. 解题思路2. 代码实现 题目链接:3577. Count the Number of Computer Unlocking Permutations 1. 解题思路 这一题其实就是一个脑筋急转弯,要想要能够将所有的电脑解锁&#x…...
【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表
1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖
在Vuzix M400 AR智能眼镜的助力下,卢森堡罗伯特舒曼医院(the Robert Schuman Hospitals, HRS)凭借在无菌制剂生产流程中引入增强现实技术(AR)创新项目,荣获了2024年6月7日由卢森堡医院药剂师协会࿰…...
ubuntu22.04 安装docker 和docker-compose
首先你要确保没有docker环境或者使用命令删掉docker sudo apt-get remove docker docker-engine docker.io containerd runc安装docker 更新软件环境 sudo apt update sudo apt upgrade下载docker依赖和GPG 密钥 # 依赖 apt-get install ca-certificates curl gnupg lsb-rel…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...