UE4子系统
UE4在4.22版本后加入了子系统即Subsystem,子系统是生命周期受控的自动实例化类,非常易用。
概述
目前在4.24版本中,子系统主要分为4大类
- 引擎
UEngineSubsystem
当引擎子系统的模块加载时,子系统将在模块的 Startup()
函数返回后执行 Initialize()
,子系统将在模块的 Shutdown()
函数返回后执行 Deinitialize()
。
通过GEngine
访问
1 | UMyEngineSubsystem MySubsystem = GEngine->GetEngineSubsystem<UMyEngineSubsystem>(); |
- 编辑器
UEditorSubsystem
当编辑器子系统的模块加载时,子系统将在模块的 Startup()
函数返回后执行 Initialize()
,子系统将在模块的 Shutdown()
函数返回后执行 Deinitialize()
。
这些子系统可通过GEditor
访问
1 | UMyEditorSubsystem MySubsystem = GEditor->GetEditorSubsystem<UMyEditorSubsystem>(); |
- 游戏实例
UGameInstanceSubsystem
生命周期跟随游戏实例的初始化和卸载
可通过UGameInstance
访问
1 | UGameInstance* GameInstance = ...; |
- 本地玩家
ULocalPlayerSubsystem
随着本地玩家创建而创建
通过ULocalPlayer
访问
1 | ULocalPlayer* LocalPlayer = ...; |
示例
创建UMyGameInstanceSubsystem
继承自UGameInstanceSubsystem
重写基类方法,如下图所示
1 | //返回false就不会自动创建 |
1 | void UMyGameInstanceSubsystem::Initialize(FSubsystemCollectionBase& Collection) |
另外我们手动创建一个继承自UGameInstance
的蓝图类
然后我们在子系统里实现一个测试方法
1 | UFUNCTION(BlueprintCallable) |
1 | void UMyGameInstanceSubsystem::TestPrint() |
在蓝图里默认直接可以得到子系统如下图
在关卡蓝图里测试
得到结果