《UE5_C++多人TPS完整教程》学习笔记14 ——《P15 创建我们自己的子系统(Creating Our Own Subsystem)》

news2024/11/30 6:57:48

本文为B站系列教学视频 《UE5_C++多人TPS完整教程》 —— 《P15 创建我们自己的子系统(Creating Our Own Subsystem)》 的学习笔记,该系列教学视频为 Udemy 课程 《Unreal Engine 5 C++ Multiplayer Shooter》 的中文字幕翻译版,UP主(也是译者)为 游戏引擎能吃么。


文章目录

  • P15 创建在线子系统
  • 15.1 游戏实例和游戏实例子系统
  • 15.2 创建游戏实例子系统类
  • 15.3 Summary


P15 创建在线子系统

本节课将尝试创建我们自己的子系统类,并进一步探讨游戏实例子系统类的基本概念、工作原理及方式。
在这里插入图片描述


15.1 游戏实例和游戏实例子系统

  1. 在创建处理多人游戏会话的新类时,一个基本问题就是如何选择这个新类的父类。其中,一个不错的选择(Pretty option)就是游戏实例类:我们的游戏实例在游戏创建时生成,在游戏关闭之前它是不会被销毁的,当我们在关卡之间跳转时也持续存在。然而创建游戏实例类的主要功能并不是管理多人游戏会话(毕竟在前几课中我们在第三人称角色类也可以做到)。
  2. 游戏实例子系统类和游戏实例类相似,它可以和游戏实例类共存(Coexist along with)。我们可以在游戏实例子系统类中独立处理与多人游戏会话相关的功能。所以这里的重点是在游戏是里创建完成后创建一个游戏实例子系统类,在游戏实例关闭时将其销毁并进行垃圾回收。
    在这里插入图片描述

    虚幻引擎(UE) 中的子系统是生命周期受控(Managed lifetimes)的自动实例化类(Automatically instanced classes)。这些类提供了易用的扩展点(Extension points),程序员可直接获得蓝图和 Python 公开(Exposure),同时避免繁复的引擎类修改或覆盖(Avoiding the complexity of modifying or overriding engine class)。
    当前支持的子系统生命周期包括:

    子系统继承自
    引擎UEngineSubsystem
    编辑器UEditorSubsystem
    游戏实例UGameInstanceSubsystem
    本地玩家ULocalPlayerSubsystem

    举例而言,如果创建了一个派生自此基类的类:

    class UMyGamesSubsystem : public UGameInstanceSubsystem
    

    将出现以下结果:
    ① 创建 UGameInstance 之后,还会创建一个名为 UMyGamesSubsystem 的实例。
    UGameInstance 初始化时,将在子系统上调用 Initialize()
    UGameInstance 关闭时,将在子系统上调用 Deinitialize()
    ④ 此时将放弃(Dropped)对子系统的引用,如果不再有对子系统的引用,则其将被垃圾回收(Garbage-collected)。


    使用编程子系统有以下几个原因:

    • 子系统可节省编程时间。
    • 子系统使您无需覆盖引擎类。
    • 子系统使您无需在已经很复杂(Busy)的类上添加更多 API 。
    • 子系统使您能通过用户友好的类型化节点(User friendly typed nodes)来访问蓝图
    • 子系统允许访问 Python 脚本来编写编辑器脚本或编写测试代码。
    • 子系统在代码库中提供模块化和一致性(Modularity and consistency)。

    子系统在创建插件时尤为实用。您不需要代码相关的说明即可让插件工作。用户只需将插件添加到游戏中,就可以确切了解插件将在何时被实例化和初始化。因此,您可以专注于UE4中提供的API和功能的使用方式。


    GameInstance子系统

    class UMyGameSubsystem : public UGameInstanceSubsystem { ... };
    

    这些子系统可通过 UGameInstance 访问,如下所示。

    UGameInstance* GameInstance = ...;
    UMyGameSubsystem* MySubsystem = GameInstance->GetSubsystem<UMyGameSubsystem>();
    

    —— 虚幻引擎官方文档《编程子系统》


15.2 创建游戏实例子系统类

  1. 在虚幻引擎内容浏览器中展开目录 “C++类\MenuSystem”,添加一个新的游戏实例子系统 C++ 类。
    在这里插入图片描述
  2. 将新添加的游戏实例子系统 C++ 类命名为 “MultiplayerSessionsSubsystem”,选择模块为我们上节课新建的插件 “MultiplayerSessions (Runtime)”。
    在这里插入图片描述
  3. 点击 “创建类” 按钮,VS 中出现弹窗,选择 “全部重新加载(A)”。
    在这里插入图片描述
  1. VS 中可以看到解决方案资源管理器出现了头文件 “MultiplayerSessionsSubsystem.h” 和源文件 “MultiplayerSessionsSubsystem.cpp”;在虚幻引擎的内容浏览器中展开目录 “Plugins/MultiplayerSessionsC++类/MultiplayerSessions/Public” 也可以看到新建的游戏实例子系统 C++ 类 “MultiplayerSessionsSubsystem”(如果没看到,可能的解决办法是关闭虚幻引擎然后在 VS 中重新生成解决方案)。
    在这里插入图片描述
    在这里插入图片描述

  2. 在 “MultiplayerSessionsSubsystem.h” 中添加代码,定义游戏实例子系统类构造函数 “UMultiplayerSessionSubsystem()” 和在线会话接口智能指针 “SessionInterface”。

    // Fill out your copyright notice in the Description page of Project Settings.
    
    #pragma once
    
    #include "CoreMinimal.h"
    #include "Subsystems/GameInstanceSubsystem.h"
    
    /* P15 创建我们自己的子系统 */
    #include "Interfaces/OnlineSessionInterface.h"
    #include "OnlineSubsystem.h"
    /* P15 创建我们自己的子系统 */
    
    #include "MultiplayerSessionsSubsystem.generated.h"
    
    /**
     * 
     */
    UCLASS()
    class MULTIPLAYERSESSIONS_API UMultiplayerSessionsSubsystem : public UGameInstanceSubsystem
    {
    	GENERATED_BODY()
    
    /* P15 创建我们自己的子系统 */
    public:
    	UMultiplayerSessionsSubsystem();
    
    protected:
    
    private:
    	// 会话接口智能指针
    	IOnlineSessionPtr OnlineSessionInterface;	// 添加头文件 "Interfaces/OnlineSessionInterface.h" 后使用,更具可读性
    	// TSharedPtr<class IOnlineSession, ESPMode::ThreadSafe> OnlineSessionInterface;	// 使用 TSharedPtr 智能指针包装器进行声明
    
    /* P15 创建我们自己的子系统 */
    
    };
    
  3. 在 “MultiplayerSessionsSubsystem.cpp” 中完善构造函数 “UMultiplayerSessionSubsystem()”,进行编译。

    // Fill out your copyright notice in the Description page of Project Settings.
    
    
    #include "MultiplayerSessionsSubsystem.h"
    
    /* P15 创建我们自己的子系统 */
    UMultiplayerSessionsSubsystem::UMultiplayerSessionsSubsystem()
    {
    	IOnlineSubsystem* OnlineSubsystem = IOnlineSubsystem::Get();			// 获取当前的在线子系统指针
    	if (OnlineSubsystem) {													// 如果当前在线子系统有效
    		OnlineSessionInterface = OnlineSubsystem->GetSessionInterface();	// 获取会话接口智能指针
    	}
    }
    /* P15 创建我们自己的子系统 */
    

15.3 Summary

本节课探讨游戏实例类和游戏实例子系统类的基本概念、工作原理及方式,新建了我们自己的游戏实例子系统 C++ 类 “MultiplayerSessionsSubsystem”,并为该类定义在线会话接口智能指针 “SessionInterface”、完善了游戏实例子系统类构造函数 “UMultiplayerSessionSubsystem()” 。
在这里插入图片描述


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

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

相关文章

GraphicsMagick 的 OpenCL 开发记录(结语)

所有代码及开发记录见&#xff1a;“gm-ocl”。

Covalent Network与卡尔加里大学建立合作,推动区块链技术创新

​Covalent Network&#xff08;CQT&#xff09;作为领先的 Web3 数据索引器和提供者&#xff0c;宣布已经与卡尔加里大学达成了具备开创性意义的合作&#xff0c;此次合作标志着推动区块链数据研究和可访问性的重要里程碑。卡尔加里大学是首个以验证者的身份加入 Covalent Net…

一、部署Oracle

部署Oracle 一、Docker部署1.Oracle11g1.1 测试环境1.1.1 拉取镜像1.1.2 启动容器1.1.3 配置容器环境变量1.1.4 修改sys、system用户密码1.1.5 创建表空间1.1.6 创建用户并授权1.1.5 使用DBeaver测试连接 二、安装包部署 一、Docker部署 1.Oracle11g 1.1 测试环境 当前只能用…

【分布式技术专题】「Zookeeper中间件」Paxos协议的原理和实际运行中的应用流程分析

Paxo算法介绍 Paxos算法是莱斯利兰伯特(Leslie Lamport)1990年提出的一种基于消息传递的一致性算法。 Paxos产生背景 Paxos算法是基于消息传递且具有高度容错特性的一致性算法&#xff0c;是目前公认的解决分布式一致性问题最有效的算法之一&#xff0c;其解决的问题就是在分…

anomalib1.0学习纪实

回顾&#xff1a;细分、纵深、高端、上游、积累、极致。 回顾&#xff1a;资本化&#xff0c;国际化&#xff0c;大干快上&#xff0c;小农思维必死无疑。 春节在深圳新地中央&#xff0c;学习anomalib1.0。 一、安装&#xff1a; 采用的是如下图的方式&#xff1a; 不过&a…

专业140+总分420+浙江大学842信号系统与数字电路考研经验电子信息与通信,真题,大纲,参考书。

今年考研已经结束&#xff0c;初试专业课842信号系统与数字电路140&#xff0c;总分420&#xff0c;很幸运实现了自己的目标&#xff0c;被浙大录取&#xff0c;这在高考是想都不敢想的学校&#xff0c;在考研时实现了&#xff0c;所以大家也要有信心&#xff0c;通过自己努力实…

Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析

案例 接下来我们就通过一个案例来演示下事务传播行为propagation属性的使用。 需求&#xff1a;解散部门时需要记录操作日志 由于解散部门是一个非常重要而且非常危险的操作&#xff0c;所以在业务当中要求每一次执行解散部门的操作都需要留下痕迹&#xff0c;就是要记录操作…

svg基础(十)滤镜-feMerge(多滤镜叠加滤镜)

feMerge:多滤镜叠加滤镜 允许同时应用滤镜效果而不是按顺序应用滤镜效果。利用result存储别的滤镜的输出可以实现这一点&#xff0c;然后在一个 <feMergeNode>子元素中访问它 1 语法 <feMerge><feMergeNode in""></feMergeNode> </feM…

去除vue自带的边距

使用vue时发现总有去不掉的外边距&#xff0c;在index.vue里面怎样设置样式都不管用 查阅资料后发现要在vue项目自带的index.html文件内添加下面的样式代码才行 <style>*{margin: 0;padding: 0;}body,html{margin: 0;padding: 0;} </style>

Vue项目创建和nodejs使用

Vue项目创建和nodejs使用 一、环境准备1.1.安装 node.js【下载历史版本node-v14.21.3-x64】1.2.安装1.3.检查是否安装成功&#xff1a;1.4.在Node下新建两个文件夹 node_global和node_cache并设置权限1.5.配置npm在安装全局模块时的路径和缓存cache的路径1.6.配置系统变量&…

红队笔记Day2 -->上线不出网机器

今天就来讲一下在企业攻防中如何上线不出网的机器&#xff01;&#xff01; 1.基本网络拓扑 基本的网络拓扑就是这样 以下是对应得的P信息&#xff0c;其中的52网段充当一个内网的网段&#xff0c;而111充当公网网段 先ping一下&#xff0c;确保外网ping不通内网&#xff0c;内…

162基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理

基于matlab的多尺度和谱峭度算法对振动信号进行降噪处理&#xff0c;选择信号峭度最大的频段进行滤波&#xff0c;输出多尺度谱峭度及降噪结果。程序已调通&#xff0c;可直接运行。 162 matlab 信号处理 多尺度谱峭度 (xiaohongshu.com)

Hive的小文件问题

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

搜索专项---最短路模型

文章目录 迷宫问题武士风度的牛抓住那头牛 一、迷宫问题OJ链接 本题思路:只需要记录各个点是有哪个点走过来的&#xff0c;就能递推得出路径。记录前驱假设从 1,1 这个点向下走到了2, 1&#xff0c;则将2,1这个点的前驱记为1,1。这样&#xff0c;将整张地图 bfs 后&#xff0c…

vue 向某个网址 传递数据

1. 需求 现在有一个网站需要 配置上另一个网站的东西 类似这样的东西吧 就是我需要再一个网站上 右边或者其他地方 放另一个页面的地址 这个地址需要给我传递东西 或我这个网站给其他的网站传递token了 id等 2.解决 window.parent.postMessage({ token: loginRes.token, id:…

阿里云服务器公网带宽收费价格表_2024更新报价

阿里云服务器公网带宽怎么收费&#xff1f;北京地域服务器按固定带宽计费一个月23元/M&#xff0c;按使用流量计费0.8元/GB&#xff0c;云服务器地域不同实际带宽价格也不同&#xff0c;阿里云服务器网aliyunfuwuqi.com分享不同带宽计费模式下带宽收费价格表&#xff1a; 公网…

软件测试如何自我提升

当一个软件测试工程师刚刚进入行业一到三年的时间&#xff0c;他们通常需要掌握一些基本技能和知识&#xff0c;并且需要学习一些新的技术和工具&#xff0c;以便更好地完成自己的测试工作。以下是一些建议&#xff0c;帮助测试工程师在这个阶段提升自己的技能。 掌握基本的测…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 2月14日,星期三

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年2月14日 星期三 农历正月初五 1、 第十四届全国冬季运动会将于17日开幕&#xff0c;部分赛事今天起陆续开赛。 2、 2024年购房政策将进一步宽松&#xff0c;专家称今年买房性价比更高。 3、 春节档票房突破45亿元&#…

LeetCode、901. 股票价格跨度【中等,单调栈】

文章目录 前言LeetCode、901. 股票价格跨度【中等&#xff0c;单调栈】题目链接及分类思路思路1&#xff1a;暴力思路2&#xff1a;单调栈写法优化&#xff1a;单调栈简化写法(数组替代栈集合) 资料获取 前言 博主介绍&#xff1a;✌目前全网粉丝2W&#xff0c;csdn博客专家、…

【王道数据结构】【chapter5树与二叉树】【P158t3】

编写后序遍历二叉树的非递归算法 #include <iostream> #include <stack> typedef struct treenode{char data;struct treenode *left;struct treenode *right; }treenode,*ptreenode;ptreenode buytreenode(char x) {ptreenode n(ptreenode) malloc(sizeof (treeno…