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. 抽象工厂的设计模式应用 在源码探索…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

Appium+python自动化(十六)- ADB命令
简介 Android 调试桥(adb)是多种用途的工具,该工具可以帮助你你管理设备或模拟器 的状态。 adb ( Android Debug Bridge)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)
🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...
【C++从零实现Json-Rpc框架】第六弹 —— 服务端模块划分
一、项目背景回顾 前五弹完成了Json-Rpc协议解析、请求处理、客户端调用等基础模块搭建。 本弹重点聚焦于服务端的模块划分与架构设计,提升代码结构的可维护性与扩展性。 二、服务端模块设计目标 高内聚低耦合:各模块职责清晰,便于独立开发…...

Netty从入门到进阶(二)
二、Netty入门 1. 概述 1.1 Netty是什么 Netty is an asynchronous event-driven network application framework for rapid development of maintainable high performance protocol servers & clients. Netty是一个异步的、基于事件驱动的网络应用框架,用于…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
C#中的CLR属性、依赖属性与附加属性
CLR属性的主要特征 封装性: 隐藏字段的实现细节 提供对字段的受控访问 访问控制: 可单独设置get/set访问器的可见性 可创建只读或只写属性 计算属性: 可以在getter中执行计算逻辑 不需要直接对应一个字段 验证逻辑: 可以…...
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题
【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要: 近期,在使用较新版本的OpenSSH客户端连接老旧SSH服务器时,会遇到 "no matching key exchange method found", "n…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...