但是随着代码量的增加,GameInstance将会变得难以维护。在4.22版本发布了之后,我们可以直接将工具写在Subsystem中,让引擎帮我们自动管理工具类的生命周期,不再需要自己维护工具的生命周期或者修改引擎的类(如GameInstance)。

UE4会自动实例化你编写的Subsystem,并且根据你的Subsystem类型(目前有5种类型)管理Subsystem的生命周期。Subsystem能够暴露接口给蓝图和Python使用,不需要修改或者继承引擎的类(如GameInstance)。

目前UE4支持的Subsystem类型有以下5种:

  1. Engine类:UEngineSubsystem
  2. Editor类:UEditorSubsystem
  3. GameInstance类:UGameInstanceSubsystem
  4. World类:UWorldSubsystem
  5. LocalPlayer类:ULocalPlayerSubsystem

名称分别对应他们依存的Outer对象(称之为Outer是因为源代码里面指向这些对象的指针名为Outer),以及他们对应的生命周期分别是:

  1. UEngine* GEngine(引擎启动期间存在,或者说游戏进程期间存在);
  2. UEditorEngine* GEditor(编辑器启动期间存在);
  3. UGameInstance* GameInstance(游戏运行期间存在);
  4. UWorld* World(关卡运行期间存在,一个游戏可能会有多个关卡,另外要注意的是编辑器下看到的场景其实也是一个World);
  5. ULocalPlayer* LocalPlayer(本地玩家存在的时候存在,实际上通常和GameInstance生命周期差不多,但是可能有多个本地玩家,而且游戏进行过程中可以随时添加减少本地玩家,所以生命周期视情况、Outer对象依附于哪个LocalPlayer而定);