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


本文为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.mzph.cn/news/690717.shtml

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

相关文章

three.js 3D可视化地图

threejs地图 可视化地图——three.js实现 this.provinceInfo document.getElementById(provinceInfo); // 渲染器 this.renderer new THREE.WebGLRenderer({antialias: true }); this.renderer.setSize(window.innerWidth, window.innerHeight); this.container.appendChild…

Linux下如何配置环境变量

在Linux下配置环境变量通常有几种方法&#xff0c;具体取决于你希望将环境变量设置为全局还是仅对当前会话有效。以下是一些常见的方法&#xff1a; 永久性全局配置&#xff1a;要使环境变量在所有用户和会话中永久生效&#xff0c;可以编辑 /etc/environment 文件。在文件中添…

Open CASCADE学习|TopoDS_Vertex与gp_Pnt相互转化

目录 gp_Pnt TopoDS_Vertex 关系和转换 使用场景 在Open CASCADE Technology (OCCT)中&#xff0c;TopoDS_Vertex和gp_Pnt是两种不同的数据类型&#xff0c;用于表示三维空间中的点。它们有不同的用途和特性&#xff1a; gp_Pnt gp_Pnt是OCCT几何库&#xff08;Geom&…

php伪协议之phar

一.phar协议 用于将多个 PHP 文件、类、库、资源&#xff08;如图像、样式表&#xff09;等打包成一个单独的文件。这个归档文件可以像其他 PHP 文件一样被包含&#xff08;include&#xff09;或执行。PHAR 归档提供了一种方便的方式来分发和安装 PHP 应用程序和库&#xff0c…

今日Java小练习

题目描述一 计算保存日期的那一年的所有天数 解题思路 分别截取日期的年月日保存为int型定义数组保存1到12月的天数&#xff08;或使用LocalDate的getDayOfMonth方法直接计算&#xff09;判断如果是闰年二月天数加1累加当前月份前所有月份的天数和用之前累加的天数加上当前月的…

ClickHouse学习

ClickHouse是由C编写的列式存储数据库&#xff08;DBMS&#xff09;&#xff0c;主要用来在线分析处理查询&#xff08;OLTP&#xff09;&#xff0c;能够用Sql查询生成的实时数据分析报告。 适用场景 大多数是读请求 、数据总是批量写入 、不更新或少更新数据、每次都是读取大…

机器学习中为什么需要梯度下降

在机器学习中&#xff0c;梯度下降是一种常用的优化算法&#xff0c;用于寻找损失函数的最小值。我们可以用一个简单的爬山场景来类比梯度下降的过程。 假设你被困在山上&#xff0c;需要找到一条通往山下的路。由于你是第一次来到这座山&#xff0c;对地形不熟悉&#xff0c;你…

Python——元组

一、元组特性介绍 元组和列表⼀样&#xff0c;也是⼀种序列类型的数据。 唯⼀的不同是&#xff0c;元组是相对不可变的。 二、⾼效创建元组 In [1]: t1 () # 创建 空 元素的元组In [2]: type(t1) Out[2]: tuple有元素的元组实际上是使⽤英⽂的逗号创建的 In [3]:…

【sgCreateTableColumn】自定义小工具:敏捷开发→自动化生成表格列html代码(表格列生成工具)[基于el-table-column]

源码 <template><!-- 前往https://blog.csdn.net/qq_37860634/article/details/136126479 查看使用说明 --><div :class"$options.name"><div class"sg-head">表格列生成工具</div><div class"sg-container"…

RSA加密,解密,加签及验签

目录 1.说明 2.加密和加签的区别 3.后端加密&#xff0c;解密&#xff0c;加签及验签示例 4.前端加密&#xff0c;解密&#xff0c;加签及验签示例 5.前端加密&#xff0c;后端解密&#xff0c;前端加签&#xff0c;后端验签 6.注意事项 1.说明 RSA算法是一种非对称加密…

【JavaScript】输入输出语法

目录 一、输出语法 二、输入语法 一、输出语法 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…

Java解决石子游戏问题

Java解决石子游戏问题 01 题目 Alice 和 Bob 用几堆石子在做游戏。一共有偶数堆石子&#xff0c;排成一行&#xff1b;每堆都有 正 整数颗石子&#xff0c;数目为 piles[i] 。 游戏以谁手中的石子最多来决出胜负。石子的 总数 是 奇数 &#xff0c;所以没有平局。 Alice 和…

Netty学习------2024/02/19

non-blocking io 非阻塞 IO 1. 三大组件 1.1 Channel & Buffer channel 有一点类似于 stream&#xff0c;它就是读写数据的双向通道&#xff0c; 可以从 channel 将数据读入 buffer&#xff0c;也可以将 buffer 的数据写入 channel&#xff0c; 而之前的 stream 要么是输…

【Linux系列】超算作业调度系统批量取消作业介绍

在使用HPC跑模型时常常需要批量取消提交的job&#xff0c;本文将三种常见的作业调度系统的批量取消作业方法进行介绍&#xff0c;方便平时使用。 一、Slurm Slurm取消/删除作业的命令为scancel&#xff0c;其基本的使用方法有&#xff1a; 命令说明scancel < jobid >删…

HCIA-HarmonyOS设备开发认证V2.0-IOT硬件子系统-I2C

目录 一、 I2C 概述二、I2C 模块相关API三、接口调用实例四、I2C HDF驱动开发4.1、开发步骤(待续...) 坚持就有收获 一、 I2C 概述 I2C&#xff08;Inter Integrated Circuit&#xff09;集成电路间总线是由 Philips 公司开发的一种简单、双向二线制同步串行总线。I2C 以主从方…

面试题:链表相交

链表相交 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表没有交点&#xff0c;返回 null 。 图示两个链表在节点 c1 开始相交&#xff1a; 思路 这个题目有2个思路&#xff0c;我先说容易想到的思路 对齐链表…

有关光猫、路由器、交换机、网关的理解

前提 在了解计算机网络的过程中&#xff0c;出现了这四个名词&#xff1a;光猫、路由器、交换机、网络。有点模糊&#xff0c;查阅互联网相关资料&#xff0c;进行整理。如有错误&#xff0c;欢迎大家批评指正。 光猫 首先光猫是物理存在的&#xff0c;大家在家里应该都可以…

初识Nginx

摘要&#xff1a;最近几个项目中的接口总是访问受限&#xff0c;需要后端同事配置Nginx代理&#xff0c;了解下Nginx后面自己配置。 Nginx 是一款高性能的开源 Web 服务器和反向代理服务器。它具有轻量级、高并发、低内存消耗等特点&#xff0c;常被用作静态资源服务、负载…

最新Discuz! X模板文件结构详细手册

| — template — default 系统内置风格模板(默认风格) | — template — default – discuz_style_default.xml 风格安装文件&#xff0c;可用风格导出功能创建 | — template — default – preview.jpg 预览图 | — template — default – common 风格中的公共包含文…

探索与实践:深度解读禅道项目管理工具的高效运用

【引言】 在日益复杂的现代项目管理领域中&#xff0c;一款优秀的项目管理工具能够极大地提升团队协作效率&#xff0c;降低项目风险&#xff0c;而禅道正是这样一款深受开发者和项目经理喜爱的产品。它是一款基于敏捷开发理念设计的开源项目管理软件&#xff0c;涵盖了产品管…