c4.Subsystem|子系统
大约 4 分钟

生命周期

生命周期 | Subsystem 类 |
---|---|
引擎(Engine) | UEngineSubsystem |
编辑器(Editor) | UEditorSubsystem |
游戏实例(GameInstance) | UGameInstanceSubsystem |
世界(World) | UWorldSubsystem |
本地玩家(LocalPlayer) | ULocalPlayerSubsystem |
创建和使用
1. 继承对应的子系统

2. 基本函数
ExorcistGameInstanceSubsystem.h
#pragma once
#include "CoreMinimal.h"
#include "Subsystems/GameInstanceSubsystem.h"
#include "MyGameInstanceSubsystem.generated.h"
UCLASS()
class EXORCIST_API UMyGameInstanceSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
//是否创建这个子系统
virtual bool ShouldCreateSubsystem(UObject* Outer) const override;
//初始化
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
//销毁
virtual void Deinitialize() override;
};
ExorcistGameInstanceSubsystem.cpp
#include "UMyGameInstanceSubsystem.h"
bool UMyGameInstanceSubsystem::ShouldCreateSubsystem(UObject* Outer) const
{
return Super::ShouldCreateSubsystem(Outer);
}
void UMyGameInstanceSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{
Super::Initialize(Collection);
}
void UMyGameInstanceSubsystem::Deinitialize()
{
Super::Deinitialize();
}
3.蓝图中使用

4. C++中调用
MyEngineSubsystem
UMyEngineSubsystem* MySubsystem = GEngine->GetEngineSubsystem<UMyEngineSubsystem>();
MyEditorSubsystem
UMyEditorSubsystem* MySubsystem = GEditor->GetEditorSubsystem<UMyEditorSubsystem>();
MyGameInstanceSubsystem
UGameInstance* GameInstance = UGameplayStatics::GetGameInstance(...);
UMyGameInstanceSubsystem* MySubsystem = GameInstance->GetSubsystem<UMyGameInstanceSubsystem>();
MyWorldSubsystem
UWorld* World=MyActor->GetWorld(); //world用各种方式也都可以
UMyWorldSubsystem* MySubsystem=World->GetSubsystem<UMyWorldSubsystem>();
MyLocalPlayerSubsystem
ULocalPlayer* LocalPlayer = Cast<ULocalPlayer>(PlayerController->Player)
UMyLocalPlayerSubsystem * MySubsystem = LocalPlayer->GetSubsystem<UMyLocalPlayerSubsystem>();
再谈生命周期
GetOuter()
UGameInstance* UGameInstanceSubsystem::GetGameInstance() const
{
return Cast<UGameInstance>(GetOuter());
}

UObject
#defineFORCEINLINE__forceinline

继承特性
提示
在C++中,继承分为公有继承、保护继承和私有继承三种方式。 对于公有继承(public inheritance),子类可以调用父类的公开(public)成员函数.
UObject————————————————————————————
| |
USubsystem |
| |
UGameInstanceSubsystem——Cast<UGameInstance>(GetOuter())
UObject
是 Unreal Engine 中所有对象的基类。USubsystem
是一个子系统抽象类,继承自UObject
。UGameInstanceSubsystem
也是是一个子系统抽象类,继承自USubsystem
。
CDO | Class Default Object
在 Unreal Engine 中,每个通过反射系统注册的 UClass 都会在引擎初始化时自动生成一个 Class Default Object(简称 CDO)。 本章不会展开说明,我们会在后续的反射章节中详细展开。
UMyObject* CDO = GetDefault<UMyObject>();
注
不要试图在 CDO 构造阶段(UObject 构造函数里)做任何依赖运行时世界或子系统的操作, 这些操作应该放到更安全的生命周期阶段(如 BeginPlay() 或子系统的初始化回调)中。