30 UE5 Subsyetem介绍

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
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容