《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.hqwc.cn/news/468887.html

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

相关文章

【AI视野·今日NLP 自然语言处理论文速览 第七十九期】Thu, 18 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Thu, 18 Jan 2024 Totally 35 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Deciphering Textual Authenticity: A Generalized Strategy through the Lens of Large Language Semantics …

云原生容器化-4 Docker仓库

1.Docker仓库 1.1 Docker Hub docker仓库用于存放docker镜像&#xff0c;可以分为公用和私有两种。Docker Hub是全球公用的仓库&#xff0c;因服务器在国外&#xff0c;国内基本不可以&#xff1b;一般需要配置阿里、腾讯等加速器。公司内部而言&#xff0c;可以搭建私有的Do…

CPU-GPU异构并行化APSP算法

一、Floyd-Warshall算法 介绍 Floyd-Warshall算法&#xff08;英语&#xff1a;Floyd-Warshall algorithm&#xff09;&#xff0c;中文亦称弗洛伊德算法或佛洛依德算法&#xff0c;是解决任意两点间的最短路径的一种算法&#xff0c;可以正确处理有向图或负权&#xff08;但…

VUE学习——表单的输入绑定

使用【v-model】。 输入框 <template><h1>表单输入绑定</h1><input type"text" v-model"message"><p>输入的值&#xff1a;{{ message }}</p> </template> <script>export default{data(){return{messa…

【开源】JAVA+Vue.js实现天然气工程业务管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、使用角色3.1 施工人员3.2 管理员 四、数据库设计4.1 用户表4.2 分公司表4.3 角色表4.4 数据字典表4.5 工程项目表4.6 使用材料表4.7 使用材料领用表4.8 整体E-R图 五、系统展示六、核心代码6.1 查询工程项目6.2 工程物资…

春节专题|产业7问:区块链厂商的现在和未来——基础设施厂商

2023转瞬即逝&#xff0c;不同于加密领域沉寂一整年后在年末集中爆发&#xff0c;对于我国的区块链厂商而言&#xff0c;稳中求胜才是关键词&#xff0c;在平稳发展的基调下&#xff0c;产业洗牌也悄无声息的到来。 从产业总体而言&#xff0c;在经过了接近3年的快速发展后&…

Android ·移动应用开发 创建第一个Android项目

文章目录 一、创建第一个Android项目1.1 准备好Android Studio1.2 运行程序1.3 程序结构是什么app下的结构res - 子目录&#xff08;所有图片、布局、字符串等资源&#xff09;AndroidManifest.xml 有四大组件&#xff0c;程序添加权限声明 Project下的结构 二、开发android时&…

【日常聊聊】新年新征程:迎接学习的挑战

&#x1f34e;个人博客&#xff1a;个人主页 &#x1f3c6;个人专栏&#xff1a;日常聊聊 ⛳️ 功不唐捐&#xff0c;玉汝于成 目录 前言 正文 结语 我的其他博客 前言 随着新的一年的到来&#xff0c;程序员们站在了全新的起点。这是一个充满机遇和挑战的时刻&#xff0…

Hive的Join连接、谓词下推

前言 Hive-3.1.2版本支持6种join语法。分别是&#xff1a;inner join&#xff08;内连接&#xff09;、left join&#xff08;左连接&#xff09;、right join&#xff08;右连接&#xff09;、full outer join&#xff08;全外连接&#xff09;、left semi join&#xff08;左…

寒假 day13

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…

红队打靶练习:Alfa:1

下载连接点击此处即可&#xff01; 目录 信息收集 1、arp 2、nmap 3、gobuster WEB web信息收集 FTP登录 smaba服务 crunch密码生成 提权 系统信息收集 权限提升 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface: eth0, type: EN10MB, …

设计模式3-责任链模式

责任链模式是一种行为设计模式&#xff0c;它允许你创建一个对象链。请求沿着这条链传递&#xff0c;直到有一个对象处理它为止。这种模式通常用于需要以某种方式动态地决定处理请求的顺序或方式的情况。 类图&#xff1a; 从图中可见最大的特点是AbstractHandler它自己聚合了自…