13- SubSystem使用

13. SubSystem使用

《InsideUE4》GamePlay架构(十一)Subsystems - 知乎 (zhihu.com)

​ 4.22版本引入该系统,4.24版本完善该系统。

1. SubSystem的必要性

​ 在GameInstance中,如果所有的资源管理都由一堆单例管理类来完成,那么很容易写错,并且不能保证全局唯一。

​ 由此引入SubSystem系统来执行这些单例管理器类的职责。

Subsystems是一套可以定义自动实例化和释放的类的框架。

​ 下面说明的Subsystem的种类,并且Subsystem的生命周期一般与GameInstance同时创建卸载。

2. SubSystem的类型

​ SubSystem有如下几类:

  • UEngineSubsystem:代表引擎,数量1,Editor或Runtime模式都是全局唯一,从进程开始创建,进程退出时销毁。

  • UEditorSubsystem:代表编辑器,数量1,只在编辑器下存在且全局唯一,从编辑器启动开始创建,到编辑器退出时销毁。

  • UGameInstanceSubsystem:代表一场游戏,数量1,从游戏启动开始创建,游戏退出时销毁。这里的一场游戏指的是Runtime或者PIE模式运行。一场游戏可能会创建多个World切换。

  • UWorldSubsystem:代表一个世界,数量可能>1,其生命周期跟归属的World有关。

  • ULocalPlayerSubsystem:代表本地玩家,数量可能>1。UE支持本地分屏多玩家类型的游戏,但往往最常见的只有一个。LocalPlayer虽然往往和PlayerController一起访问,但是其生命周期其实是跟UGameInstance一起的(即默认一开始就创建好一定数量的本地玩家),或者更准确地说,是跟LocalPlayer的具体数量挂钩的。

3. Subsystem的使用

​ 创建一个Subsystem的C++类,并实现如下三个函数:

  • ShouldCreateSubsystem:一般实现为调用父类(Super)的该方法,并返回true

  • Initialize:一般实现为调用父类(Super)的该方法,再进行自己的资源创建活动

  • Deinitialize:一般实现为调用父类(Super)的该方法,再进行自己的资源销毁活动

image-20231214211622782