中EN
概念页

子系统

Subsystems

更新于 2026-10-11 约 7 分钟UE5Subsystem生命周期插件

子系统 (Subsystem) 是自动实例化、生命周期绑定在宿主对象上的类:Engine、Editor、GameInstance、World、LocalPlayer 五种。宿主创建时自动创建并 Initialize(),宿主关闭时 Deinitialize(),之后无引用即被 GC。它替代了「继承 GameInstance 塞管理器」的老做法,自带按类型的蓝图节点和 Python 访问,特别适合插件。官方编程页只列四种,World 子系统依据 5.8 Python API 补充。

为什么要子系统

官方:子系统 (Subsystem) 是自动实例化、生命周期受管理的类,提供易用的扩展点,立即获得蓝图和 Python 暴露,同时避免修改或继承引擎类。理由包括:节省编码、避免继承引擎类、避免往已经很臃肿的类(如 GameInstance)上加 API、蓝图中有按类型的智能节点(无需 Cast)、Python 访问、模块化;对插件尤其有用——用户启用插件即可,作者明确知道它何时被实例化和初始化。(Programming Subsystems)这是对 Gameplay 框架 中「继承 GameInstance 塞管理器」老做法的替代。

五种生命周期

子系统基类生命周期绑定获取方式
UEngineSubsystem引擎;模块 Startup() 返回后 Initialize(),Shutdown() 返回后 Deinitialize()GEngine->GetEngineSubsystem<T>()
UEditorSubsystem编辑器;同上GEditor->GetEditorSubsystem<T>()
UGameInstanceSubsystemGameInstanceGameInstance->GetSubsystem<T>()
UWorldSubsystemUWorldWorld->GetSubsystem<T>()(UE 5.8 API,另有静态重载 UWorld::GetSubsystem<T>(World),找不到时返回 nullptr;UWorldSubsystem / UWorld::GetSubsystem API)
ULocalPlayerSubsystem本地玩家LocalPlayer->GetSubsystem<T>()

前四行除 World 外均来自官方 Programming Subsystems 页;该页的生命周期表只列了 Engine、Editor、GameInstance、LocalPlayer 四种。World 子系统依据 UE 5.8 Python API:UWorldSubsystem 是「与 UWorld 共享生命周期的自动实例化、自动初始化系统」的基类,FWorldSubsystemCollection 负责为已初始化的世界调用 PostInitialize 和 OnWorldBeginPlay。(Programming Subsystems)

生命周期(以 GameInstance 为例)

sequenceDiagram
  participant GI as UGameInstance
  participant S as UMyGamesSubsystem
  GI->>S: GameInstance 创建后,自动创建子系统实例
  GI->>S: GameInstance 初始化 → Initialize(Collection)
  GI->>S: GameInstance 关闭 → Deinitialize()
  Note over S: 引用被释放,若无其他引用则被 GC 回收

(Programming Subsystems)最后一步意味着:别在外部长期强引用子系统,否则它会比宿主活得更久;GC 规则见 垃圾回收与对象生命周期。

用法

UCLASS()
class UMyGamesStatsSubsystem : public UGameInstanceSubsystem
{
    GENERATED_BODY()
public:
    virtual void Initialize(FSubsystemCollectionBase& Collection) override;
    virtual void Deinitialize() override;
    void IncrementResourceStat();
};

(官方示例,Programming Subsystems)需要蓝图访问的函数照常加 UFUNCTION() 标记,见 蓝图与 C++ 协作、UObject 与反射系统。Python 用 unreal.get_engine_subsystem(...)、unreal.get_editor_subsystem(...)(官方注明 Python 为实验性功能)。

选哪种

需要的寿命选择典型
跨关卡、整个游戏会话GameInstance存档、成就统计、在线会话
跟当前关卡/世界走World关卡内的全局管理器(生成、天气)
每个本地玩家一份LocalPlayer输入映射、UI 管理(分屏)
引擎/编辑器全局Engine / Editor工具、资产处理、编辑器脚本

(典型用途为通识归纳;增强输入的映射上下文本身就通过 LocalPlayer 子系统添加,见 增强输入。)

坑

  • 编辑器中 PIE、编辑器世界、预览世界都是 UWorld,World 子系统会为它们各自创建;需要过滤时重写 DoesSupportWorldType(EWorldType),默认的 ShouldCreateSubsystem 会调用它判断(UE 5.8 API)。World 子系统还有额外的生命周期回调:PostInitialize(所有 World 子系统初始化之后)、OnWorldBeginPlay(在所有 Actor 的 BeginPlay 之前)、OnWorldEndPlay、PreDeinitialize;需要 Tick 时继承 UTickableWorldSubsystem(UWorldSubsystem / UWorld::GetSubsystem API)。
  • Engine/Editor 子系统所在模块的加载阶段决定初始化时机,见 模块、插件与构建系统。
  1. Programming Subsystems UE 5.8 文档
  2. UWorldSubsystem / UWorld::GetSubsystem API UE 5.8 API 参考

相关页面

游戏开发 · UE5Gameplay 框架Gameplay FrameworkGameplay 框架 (Gameplay Framework) 是 UE 提供的一组相互配合的类,用来搭建游戏的基本结构:Actor 与组件 (Component) 构成场景中的一切;GameMode 在服务器上定规则并生成玩家;玩家由“控制器 (Controller) + 棋子 (Pawn)”组成;GameState 与 PlayerState 负责把全局与每个玩家的状态复制给所有客户端;GameInstance 跨关卡存活。游戏开发 · UE5垃圾回收与对象生命周期Garbage Collection & Object LifecycleUE 用标记-清除式的可达性分析管理 UObject 内存:从根集合 (Root Set) 出发沿反射可见的强引用遍历对象图,找不到的对象在下次垃圾回收 (Garbage Collection, GC) 时被删除。因此“谁持有 UPROPERTY 引用”决定了对象活多久;Actor 调用 Destroy() 只是请求销毁,真正释放仍取决于引用是否全部放开。游戏开发 · UE5模块、插件与构建系统Modules, Plugins & Build SystemUE 的代码由模块 (Module) 组成:每个模块是一个独立编译单元,用 [模块名].Build.cs 声明依赖。插件 (Plugin) 是可按项目启用/禁用的代码与内容集合,用 .uplugin 描述,可包含多个模块。虚幻构建工具 (UnrealBuildTool, UBT) 根据 .Target.cs 和 .Build.cs(而不是 IDE 的 .sln)编译,默认把模块编成 DLL 由一个可执行文件加载,也可整体链接成单体 (Monolithic) 可执行文件。游戏开发 · UE5蓝图与 C++ 协作Blueprint & C++ InteropEpic 官方建议:多数项目混用蓝图 (Blueprint) 与 C++,以 C++ 作为基础、在其上构建蓝图类。C++ 适合“编程”——定义系统;蓝图适合“脚本”——在已有系统上定义具体行为。两者通过反射说明符互相调用:C++ 用 BlueprintCallable/BlueprintReadWrite 等暴露给蓝图,用 BlueprintImplementableEvent/BlueprintNativeEvent 让蓝图实现或覆盖 C++ 声明的函数。游戏开发 · UE5UObject 与反射系统UObject & Reflection System虚幻引擎 (Unreal Engine) 的对象基类是 UObject。在 C++ 类、属性、函数上加 UCLASS/UPROPERTY/UFUNCTION 等宏,再由构建前的预处理工具虚幻头文件工具 (Unreal Header Tool, UHT) 扫描头文件生成代码,引擎就能在运行时“看见”这些类型——这就是反射系统 (Reflection System)。垃圾回收、序列化、编辑器面板、蓝图、网络复制都建立在它之上。游戏开发 · UE5UMG、Slate 与 Common UIUMG, Slate & Common UISlate 是 UE 平台无关的 C++ 声明式 UI 框架(编辑器即用它构建),UMG 是在其之上的可视化控件蓝图层(UE 5.8 API:UWidget 是所有暴露给 UObject 的被包装 Slate 控件的基类),Common UI 插件再在 UMG 之上补充多层界面、输入路由、手柄导航、平台按键图标和样式资产。官方 UMG 最佳实践强调事件驱动更新而非绑定/Tick、固定分辨率与 DPI 制作、用 Scale Box 而非 Render Transform 做永久缩放。游戏开发 · UE5Gameplay 标签深入Gameplay Tags In DepthGameplay 标签 (Gameplay Tags) 是用 . 分层的用户定义标签,必须登记到标签字典(项目设置 .ini、数据表或 C++ 原生标签宏)。对象用 FGameplayTagContainer 持有多个标签并以 HasTag/HasAny/HasAll 判断(注意空集合语义),复杂条件用 FGameplayTagQuery 的叶/根表达式组合并配置在资产里。它是 GAS、AI 和各类玩法状态的通用词汇表;大项目可限制标签编辑权限,并用 IGameplayTagAssetInterface 免 Cast 取标签。游戏开发 · UE5存档系统SaveGameUE 的存档围绕自定义的 USaveGame 子类进行:保存时把需要持久化的数据从游戏世界拷进 SaveGame 对象,再用 UGameplayStatics 写入某个存档槽(槽名 + 用户索引);读档时反过来。官方推荐用 AsyncSaveGameToSlot 异步保存,避免掉帧,也避免某些平台的认证问题。游戏开发 · UE5Game Features 与模块化玩法Game Features & Modular GameplayGame Features 与 Modular Gameplay 两个插件让开发者把一个玩法功能做成独立的插件,可以单独启用或停用。功能本身由一个 GameFeatureData 资产里的 Action 列表描述,最常用的是 Add Components:把插件里的组件按需挂到已有的 Actor 类上。这样主工程的代码保持干净,无关功能之间不会意外产生依赖,对需要长期增减功能的线上产品尤其重要。游戏开发 · UE5编辑器扩展与 Python 脚本Editor Extension & Python Scripting扩展 UE 编辑器有三条主要路线,门槛由低到高:Python 脚本(只在编辑器中可用,适合批量处理资产和串联外部 DCC 管线)、Editor Utility Widget(基于 UMG 的蓝图编辑器界面,做成自定义标签页),以及 C++ 编辑器插件(如 Editor Standalone Window 模板,用 Slate 的声明式语法构建窗口)。游戏开发 · UE5音频系统与 MetaSoundsAudio System & MetaSoundsUE5 的音频资产分三层:音源 (Sound Source) 负责产生声音,UE5 主推 MetaSounds,它是一张由设计师搭建的数字信号处理 (DSP) 图,能精确到单个采样;分组与混音用 Sound Class 和 Sound Class Mix 批量调整音量和音高;空间与资源由 Sound Attenuation(随距离衰减和空间化)和 Sound Concurrency(限制同时播放数量)控制。需要和节拍对齐的玩法可以用 Quartz 做精确到采样的调度。游戏开发单例与服务定位器Singleton & Service Locator单例 (Singleton) 同时承诺两件事:一个类只有一个实例,并且提供全局访问点。Nystrom 认为它在游戏里弊大于利,因为单例本质上就是全局变量。服务定位器 (Service Locator) 是更灵活的“近亲”:它同样给出全局访问点,但调用者只依赖抽象服务接口,具体实现由定位器在运行时或编译期决定,还可以退化为空服务。两者都应当慎用,首选仍是直接把对象传进去。游戏开发子系统启动与关闭Subsystem Start-Up & Shut-Down游戏引擎由许多相互依赖的子系统组成,启动时必须按依赖顺序初始化(B 依赖 A,则先启动 A),关闭时通常反序。C++ 全局/静态对象的构造与析构顺序不可预测,「首次调用时构造」的函数静态单例也无法控制析构顺序且时机不可控。GEA 推荐最朴素的方案:单例管理器的构造/析构函数什么也不做,提供显式的 startUp() / shutDown(),在 main() 里按顺序手动调用。游戏开发 · UE5增强输入Enhanced Input增强输入 (Enhanced Input) 是 UE5 默认启用的输入插件,把输入拆成四层:输入动作 (Input Action) 表示“玩家想做什么”,输入映射上下文 (Input Mapping Context) 规定“哪些按键在什么情境下触发它”,输入修饰器 (Input Modifier) 预处理原始值,输入触发器 (Input Trigger) 判定是否触发。上下文可在运行时按优先级增删,从而用数据资产而非代码处理情境切换、按键冲突与改键。综合游戏编程模式选型:解耦与性能Choosing Game Programming Patterns本页把《Game Programming Patterns》里的 19 个模式放到同一张取舍图上:大多数模式要么为了解耦(降低改代码时需要装进脑子里的知识量),要么为了性能(利用对数据和硬件的具体假设),而这两个目标经常互相拉扯。下面先讲全书的定位和 Nystrom 的架构观,再给出按问题选模式的路线和与 UE 的对照。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原