Subsyetem用途
- 生命周期受控的自动实例化类。
- 定义了一系列自动实例化和释放的类
- 根据父类不同,实现不同的生命周期
- 依附依存的Outer对象(拥有者/容器)
Subsyetem类别和Outer对象
- UEngineSubsystem - UEngine* GEngine
- UEditorSubsystem - UEditorEngine* GEditor
- UGameInstanceSubsystem - UGameInstance* GameInstance
- UWorldSubsystem - UWorld* World
- ULocalPlayerSubsystem - ULocalPlayer* LocalPlayer
Subsyetem优点
- 无需自己写单例实现:得分系统/XX管理器等之类
- 无需自己实现创建,销毁等逻辑
- 避免从UGameInstance继承的子类里实现太多复杂的功能
- 封装性更好,更方便迁移到不同项目
三种运行模式
- 编辑器模式 打开编辑器后的运行状态
- Runtime模式 游戏打包后的运行状态
- PIE模式 在编辑器里点击Play后的运行状态。
生命周期和数量
- UEngine* GEngine:1。 Editor或Runtime模式都是全局唯一,lifetime 进程启动~进程退出。
- UEditorEngine* GEditor:1。只在编辑器下存在且全局唯一,lifetime 编辑器启动~编辑器退出。
- UGameInstance* GameInstance:1。 lifetime 游戏启动开始~游戏退出。
- UWorld* World:>1。lifetime 与GameMode密切相关(游戏中可切换), 在编辑器和游戏状态下有存在多个类型
- ULocalPlayer* LocalPlayer:>1。lifetime 游戏开始~游戏退出. 也跟LocalPlayer动态创建相关.
官方子系统范例
// 外部获取
UGameInstance* GameInstance = ...;
UMyGamesStatsSubsystem * MySystem = GameInstance->GetSubsystem<UMySystem>();
UCLASS()
class UMyGamesStatsSubsystem : public UGameInstanceSubsystem
{
GENERATED_BODY()
public:
// Begin USubsystem
virtual void Initialize(FSubsystemCollectionBase& Collection) override;
virtual void Deinitialize() override;
// End USubsystem
void IncrementResourceStat();
private:
// All my variables
};
image.png
-
参看大钊的关系图
image.png