UE4/5C++之SubSystem的了解与创建
目录
了解生命周期
为什么用他,简单讲解?
SubSystems创建和使用
创建SubSystems中的UGamelnstanceSubsystem类:
写基本的3个函数:
在蓝图中的样子:
创建SubSystems中的UEditorSubsystem类:
SubSystem是什么就不多说了,可以看看大钊的相关文章:
《InsideUE4》GamePlay架构(十一)Subsystems - 知乎 (zhihu.com)
这篇文章很好的讲解了关于SubSystems的相关内容,我也就讲讲应该需要知道的重点和怎么做:
了解生命周期
第一步是了解SubSystems中提供框架中的5个生命周期:
UEngineSubsystem
代表引擎,数量1。Editor或Runtime模式都是全局唯—,从进程启动开始创建,进程退出时销毁。
UEditorSubsystem
代表编辑器,数量为1。顾名思义,只在编辑器下存在且全局唯—,从编辑器启动开始创建,到编辑器退出时销毁。
UGamelnstanceSubsystem
代表—场游戏,数量1。从游戏的启动开始创建,游戏退出时销毁。这里的—场游戏指的是Runtimea或PIE模式的运行的都算,—场游戏里可能会创建多个World【或者叫Level】切换。
UWorldSubsystem
代表—个世界,数量可能>1。其生命周期跟归属的World【或者叫Level】有关
代表本地玩家,数量可能>1。UE支持本地分屏多玩家类型的游戏,但往往最常见的是就只有一个。LocalPlayer虽然往往跟Playercontroller—
ULocalPlayerSubsystem
起访问,但是其生命周期其实是跟UGamelnstance—起的(默认—开始的时候就创建好—定数量的本地玩家),或者更准确的说是跟LocalPlayer的具体数量挂钩(当然你也可以运行时动态调用AddLocalPlayer)。
为什么用他,简单讲解?
不仅仅是因为其中的5个生命周期,更是因为其的可移植性强,并且可以解放你的双手,无需时时刻刻考虑内存问题:类似于在哪里new和在哪里delete的问题。
避免某个如pawn类,gameinstance类过于臃肿。
方便团队合作不同模块,方便不同插件的引用。
更好的封装,避免了数据污染。
甚至可以最为简单粗暴的将里面的内容复制粘贴到其他项目中。
SubSystems创建和使用
那么在了解了生命周期之后,想必如果想要做一个计分系统之类的东西,大家都应该知道要在哪个生命周期制作了把。
这里我就做继承于UGamelnstanceSubsystem的类了。
创建SubSystems中的UGamelnstanceSubsystem类:
正常c++创建搜索:

这个命名其实可以取各个不同的系统,因为它的可移植性,所以这个系统模块是很好让其他人进行分工合作的,比如计分系统写一个这个,血量系统写一个这个。

然后我们可以看见这个空空如也的类。

对此我们需要写3个函数。
写基本的3个函数:

头文件:
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "LJGameInstanceSubsystem.generated.h"/*** */
UCLASS()
class UEDSTUDY_API ULJGameInstanceSubsystem : public UGameInstanceSubsystem
{GENERATED_BODY()
public://是否创建这个子系统virtual bool ShouldCreateSubsystem(UObject* Outer) const;//初始化virtual void Initialize(FSubsystemCollectionBase& Collection);//销毁virtual void Deinitialize();
};
cpp文件:
// Fill out your copyright notice in the Description page of Project Settings.#include "LJGameInstanceSubsystem.h"bool ULJGameInstanceSubsystem::ShouldCreateSubsystem(UObject* Outer) const
{Super::ShouldCreateSubsystem(Outer);return true;
}void ULJGameInstanceSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{//可以对一些资源进行初始化Super::Initialize(Collection);
}void ULJGameInstanceSubsystem::Deinitialize()
{//这里对资源进行卸载Super::Deinitialize();
}
然后我们在创建一个简单的变量,和一个函数。
在蓝图中的样子:
然后在蓝图中可以看见:


如果想要在蓝图中创建,就需要加一些东西:

详情可以看这个:
UE4/5关于c++中的actor组件无法创建蓝图类的解决方法_多方通行8的博客-CSDN博客
UE4/5C++之关于UCLASS()的说明符和元数据修饰符_多方通行8的博客-CSDN博客
然后就可以创建了:

创建SubSystems中的UEditorSubsystem类:
和之前创建UGameInstanceSubsystem一样,对此我就直接在项目中直接创建了:

然后这样:

头文件:
// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "EditorSubsystem.h"
#include "LJEditorSubsystem.generated.h"/*** */
UCLASS(Blueprintable)
class UEDSTUDY_API ULJEditorSubsystem : public UEditorSubsystem
{GENERATED_BODY()
public://是否创建这个子系统virtual bool ShouldCreateSubsystem(UObject* Outer) const;//初始化virtual void Initialize(FSubsystemCollectionBase& Collection);//销毁virtual void Deinitialize();
};
cpp文件:
// Fill out your copyright notice in the Description page of Project Settings.#include "LJEditorSubsystem.h"bool ULJEditorSubsystem::ShouldCreateSubsystem(UObject* Outer) const
{Super::ShouldCreateSubsystem(Outer);return true;
}void ULJEditorSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{//可以对一些资源进行初始化Super::Initialize(Collection);
}void ULJEditorSubsystem::Deinitialize()
{//这里对资源进行卸载Super::Deinitialize();
}
创建这个之后,我们需要注意的是需要在项目的bulid.cs中输入:
"EditorSubsystem"这个模块才能编译成功【而我的UE5可以不输入这个模块就成功了,不知道是什么原因,但我还是写出来,以防止各位可能出现相关的问题】

然后在蓝图中的这里看到:

因为都是编辑器的生命周期,所以在其他的蓝图里面只能进行cast to 某个类,而无法直接看到这个,所以我们才能在编辑器工具中看到:
不论是编辑器工具控件或者是编辑器工具蓝图都可以看见:



相关文章:
UE4/5C++之SubSystem的了解与创建
目录 了解生命周期 为什么用他,简单讲解? SubSystems创建和使用 创建SubSystems中的UGamelnstanceSubsystem类: 写基本的3个函数: 在蓝图中的样子: 创建SubSystems中的UEditorSubsystem类: SubSyste…...
牛客网在线编程SQL篇非技术快速入门题解(二)
大家好,我是RecordLiu。 初学SQL,有哪些合适的练习网站推荐呢? 如果你有编程基础,那么我推荐你到Leetcode这样的专业算法刷题网站,如果没有,也不要紧,你也可以到像牛客网一样的编程网站去练习。 牛客网有很多面向非技…...
航天器轨道六要素和TLE两行轨道数据格式
航天器轨道要素 椭圆轨道六根数指的是:半长轴aaa,离心率e,轨道倾角iii、升交点赤经Ω\OmegaΩ、近地点辐角ω\omegaω、和过近地点时刻t0t_0t0(或真近点角φ)。 决定轨道形状: 轨道半长轴aaa࿱…...
【Spring Cloud Alibaba】第01节 - 课程介绍
一、Spring Cloud Alibaba 阿里巴巴公司 以Spring Cloud的衍生微服务一站式解决方案 二、学习Spring Cloud Alibaba的原因 Spring Cloud 多项组件宣布闭源或停止维护Spring Cloud Alibaba 性能优于Spring Cloud 三、适应群体 有Java编程和SpringBoot基础,最好有Sp…...
iOS和Android手机浏览器链接打开app store或应用市场下载软件讲解
引言当开发一个app出来后,通过分享引流用户去打开/下载该app软件,不同手机下载的地方不一样,比如:ios需要到苹果商店去下载,Android手机需要到各个不同的应用商店去下载(华为手机需要到华为应用商店下载,vi…...
2023第十四届蓝桥杯省赛java B组
试题 A: 阶乘求和 本题总分:5 分 【问题描述】 令 S 1! 2! 3! ... 202320232023!,求 S 的末尾 9 位数字。 提示:答案首位不为 0。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数…...
windows下如何快速搜索文件内容
安装git,使用linux命令 grep 这里不再多说 windows版本的命令 Windows提供find/findstr类似命令,其中findstr要比find功能更多一些,可以/?查看帮助。...
Redis集群分片
文章目录1、Redis集群的基本概念2、浅析集群算法-分片-槽位slot2.1 Redis集群的槽位slot2.2 Redis集群的分片2.3 两大优势2.4 如何进行slot槽位映射2.5 为什么redis集群的最大槽数是16384个?2.6 Redis集群不保证强一致性3、集群环境搭建3.1 主从容错切换迁移3.2 主从…...
ISP-AF相关-聚焦区域选择-清晰度评价-1(待补充)
1、镜头相关 镜头类型 变焦类型: 定焦、手动变焦、自动变焦 光圈: 固定光圈、手动光圈、自动光圈 视场角: 鱼眼镜头、超广角镜头、广角镜头、标准镜头、长焦镜头、超长焦镜头(由大至小) 光圈: 超星…...
[element-ui] el-table行添加阴影悬浮效果
问题: 在el-table每一行获得焦点与鼠标经过时,显示一个整行的阴影悬浮效果 /*其中,table-row-checkd是我自定义的焦点行添加类名,大家可以自己起名*/ .el-table tbody tr:hover,.el-table tbody tr.table-row-checked{box-shadow: 0px 3px …...
分布式存储技术(上):HDFS 与 Ceph的架构原理、特性、优缺点解析
面对企业级数据量,单机容量太小,无法存储海量的数据,这时候就需要用到多台机器存储,并统一管理分布在集群上的文件,这样就形成了分布式文件系统。HDFS是Hadoop下的分布式文件系统技术,Ceph是能处理海量非结…...
【python设计模式】20、解释器模式
哲学思想: 解释器模式(Interpreter Pattern)是一种行为型设计模式,它提供了一种方式来解释和执行特定语言的语法或表达式。该模式中,解释器通过将表达式转换为可以执行的对象来实现对表达式的解释和执行。通常…...
【PostgreSQL】通过docker的方式运行部署PostgreSQL与go操作数据库
目录 1、docker的方式运行部署PostgreSQL 2、控制台命令 3、go操作增删改查 1、docker的方式运行部署PostgreSQL docker pull postgres docker run --name learn_postgres -e POSTGRES_PASSWORDdocker_user -e POSTGRES_USERdocker_user -p 5433:5432 -d postgres进入容器&am…...
Kotlin协程序列:
1: 使用方式一 ,callback和coroutine相互转化。 import kotlinx.coroutines.* import java.lang.Exception class MyCallback {fun doSomething(callback: (String?, Exception?) -> Unit) {// 模拟异步操作GlobalScope.launch {try {delay(1000) // 延迟 1 秒…...
java获取视频时长
1、先导包 <dependency><groupId>ws.schild</groupId><artifactId>jave-all-deps</artifactId><version>2.6.0</version> </dependency>2、获取时长 Testpublic void test01() {long time 0;try {String url "http://…...
EDAS投稿系统的遇到的问题及解决办法
问题1: gutter: Upload failed: The gutter between columns is 0.2 inches wide (on page 1), but should be at least 0.2 inches 解决: 在\begin{document}前添加\columnsep 0.201 in(0.2in也会报错,建议填大一点点)…...
t-learning 产品经理课程笔记
t-learning 腾讯公开课——产品经理课程 第一课 化身用户研究员,张小龙《产品精讲》 1-3:执行 4-7:中坚力量 7:核心leader 能解决问题的,就是好的产品经理 如何储备产品知识与素养 (1)了解并…...
校招,从准备开始准备(持续更新ing...)
诸神缄默不语-个人CSDN博文目录 作者现在有科研任务在身(今天还在标数据哦),所以不能实习。 所以就是纯纯拉个表。 最近更新时间:2023.4.9 最早更新时间:2023.4.6 文章目录1. 学习资料和知识点清单1.1 机器学习1.2 深…...
Android:使用LayerDrawable动态生成四宫格头像(包含双人、三人头像)
其实用自定义View也可以实现,我比较懒,就用LayerDrawable来创建一个新的Drawable资源实现。 举例4宫格,9宫格原理类似,每个图标的位置需要用边距慢慢调成预期的效果 效果如下: 双人头像: 三人头像&#x…...
Android Jetpack 从使用到源码深耕【数据库注解Room 从实践到原理 】(三)
前面两篇文章,我们一起学习了,Room引入的背景、Room的使用方式、Room的实现原理猜想验证、Room的源码原理探索总结。 本文,我们将其中牵扯到的课外知识点 or 过程中没有说到的知识点,进行一下单独的总结。 题外话:扩展知识点总结 1. 抽象工厂的设计模式应用 在源码探索…...
微信小程序结合HTTP接口打造智能门锁远程控制系统
1. 为什么选择微信小程序控制智能门锁? 每次出门都要检查钥匙带没带的日子该结束了!用微信小程序控制智能门锁,就像把门禁系统装进了每天必用的微信里。我去年给公司办公室装了这个系统,现在同事们刷脸进门、手机远程开门两不误&a…...
代码随想录算法训练营第十天|LeetCode 232 用栈实现队列、LeetCode 225 用队列实现栈、LeetCode 20 有效的括号、LeetCode 1047 删除字符串中的所有相邻重复项
参考文章均来自代码随想录 栈与队列理论文章链接 LeetCode 232 用栈实现队列 参考文章链接 请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(push、pop、peek、empty): 实现 MyQueue 类: void push(in…...
BEYOND REALITY Z-Image创意玩法:用AI生成不同风格的人物肖像
BEYOND REALITY Z-Image创意玩法:用AI生成不同风格的人物肖像 1. 认识BEYOND REALITY Z-Image创作引擎 BEYOND REALITY SUPER Z IMAGE 2.0是一款基于Z-Image-Turbo Transformer架构的高精度写实人像生成模型。它通过BF16高精度推理和专属优化算法,能够…...
如何让扫描PDF变得可搜索:PDFOCR-Desktop的智能文字识别方案
如何让扫描PDF变得可搜索:PDFOCR-Desktop的智能文字识别方案 【免费下载链接】pdfocr-desktop PDF OCR Application, adds an OCR text layer to scanned PDF files, allowing them to be copied and searched. 项目地址: https://gitcode.com/gh_mirrors/oc/pdfo…...
嵌入式AI模型量化实战:用int8给ResNet减重80%还不掉精度
嵌入式AI模型量化实战:用int8给ResNet减重80%还不掉精度 在边缘计算设备上部署神经网络时,工程师们常常面临一个两难选择:要么接受模型体积过大导致的内存溢出,要么忍受量化带来的精度暴跌。去年我们在智能摄像头项目中就遇到了这…...
STM32主从定时器实战:用CubeMX搞定PWM移相+动态调占空比(附G474配置)
STM32主从定时器实战:CubeMX图形化配置PWM移相与动态调占空比 在电力电子和电机控制领域,精确的PWM信号控制是系统高效运行的关键。对于需要多路相位可调PWM的应用场景,如交错并联DC/DC变换器、三相逆变器等,传统的手动寄存器配置…...
Canvas Quest人像修复与增强实战:老照片修复与画质提升
Canvas Quest人像修复与增强实战:老照片修复与画质提升 1. 老照片修复的痛点与解决方案 翻开家里的老相册,总能看到一些泛黄、破损或模糊的照片。这些承载着珍贵记忆的画面,往往因为年代久远而变得难以辨认。传统的手工修复不仅耗时费力&am…...
孟德尔随机化实战(五)—— 告别报错!Error in if (out == “[]“) 深度解析与TwoSampleMR参数调优全攻略
1. 报错现象深度解析:为什么会出现"参数长度为零"? 最近在孟德尔随机化分析交流群里,这个报错出现的频率简直高得离谱:"Error in if (out "[]") { : argument is of length zero"或者它的中文版&q…...
ThreadLocal内存泄漏警告!多线程MDC使用必须知道的3个避坑点
ThreadLocal内存泄漏实战:多线程MDC避坑指南与深度解决方案 当你在凌晨三点被报警电话惊醒,发现生产环境因为内存溢出而崩溃时,排查结果指向一个看似无害的MDC日志组件——这种场景在过去两年里我已经经历了三次。ThreadLocal作为MDC的底层实…...
Java开发必备:高德、百度、WGS84坐标互转实战(附完整代码)
Java开发实战:高德、百度与WGS84坐标系互转解决方案 当你需要在不同地图服务之间切换时,坐标系的差异往往会成为开发中的痛点。想象一下这样的场景:你的应用同时接入了高德地图和百度地图,用户上传的GPS数据却无法在两个平台上准确…...
