中EN
概念页

Game Features 与模块化玩法

Game Features & Modular Gameplay

更新于 2026-10-11 约 10 分钟UE5Game FeaturesModular Gameplay插件Lyra

Game Features 与 Modular Gameplay 两个插件让开发者把一个玩法功能做成独立的插件,可以单独启用或停用。功能本身由一个 GameFeatureData 资产里的 Action 列表描述,最常用的是 Add Components:把插件里的组件按需挂到已有的 Actor 类上。这样主工程的代码保持干净,无关功能之间不会意外产生依赖,对需要长期增减功能的线上产品尤其重要。

为什么要这样做

官方列出的好处:保持项目代码干净可读;避免无关功能之间意外的交互或依赖,这对随时间改变功能集的线上产品 (live products) 尤其重要。(Game Features and Modular Gameplay in Unreal Engine)它把 模块、插件与构建系统 中的插件机制用到玩法层:主工程只提供基础 Actor,具体功能由插件「注入」。

搭建

  1. 启用 Game Features 和 Modular Gameplay 插件(都在 Gameplay 分类下),然后重启。
  2. 新建插件时选择 Game Feature (Content Only),插件必须保存在项目的 /Plugins/GameFeatures/ 目录下。
  3. 在插件内容目录中新建一个数据资产,类选 GameFeatureData,名字与插件相同。
  4. 在它的 Actions 数组里添加 Action。首次创建 GameFeatureData 后要重启一次编辑器,因为该类资产在编辑器启动时加载;之后修改无需重启。(Game Features and Modular Gameplay in Unreal Engine)

Action 类型

Action作用
Add Cheats注册 Cheat Manager 扩展,添加调试作弊命令;Shipping 构建中不会实例化
Add Components把组件按需添加到指定的 Actor 子类上;最常用
Add Data Registry / Data Registry Source添加数据注册表,或往已有注册表里添加数据表
Add World Partition Content为功能添加 世界分区 内容

(Game Features and Modular Gameplay in Unreal Engine)

Add Components 的工作方式

sequenceDiagram
  participant A as 主工程 Actor(如 MyPawn)
  participant M as UGameFrameworkComponentManager
  participant F as Game Feature 插件
  A->>M: BeginPlay 中调用 AddReceiver(this)
  F->>M: 功能激活:Add Components Action
  M->>A: 给匹配的 Actor 添加插件里的组件

上图中,Actor 先在 BeginPlay 里把自己注册为「接收者」,功能激活时,组件管理器再把插件里的组件加给匹配的 Actor。

  • Actor 必须向 GameInstance 子系统 UGameFrameworkComponentManager 注册:GetGameInstance()->GetSubsystem<UGameFrameworkComponentManager>()->AddReceiver(this),一般写在 BeginPlay 里。(Game Features and Modular Gameplay in Unreal Engine)组件管理器本身就是一个 子系统。
  • 可以指定组件只在客户端、只在服务器或两端都添加(默认两端都添加)。
  • 组件应来自插件本身,并承担这个功能的全部逻辑和数据;与主工程 Actor 的交互越少,功能越容易移植到别的项目。
  • 坑:Add Components 不支持用基类 AActor 作目标,系统会忽略这部分配置;应该选最窄的那组需要该组件的 Actor 子类。没有共同父类时,就配多个 Add Components Action。(Game Features and Modular Gameplay in Unreal Engine)

插件状态机

UGameFeaturesSubsystem 是一个引擎子系统 (UEngineSubsystem),为每个 Game Feature 插件维护一个状态机对象 (UGameFeaturePluginStateMachine),按插件 URL(file: 或 installbundle: 协议)寻址。(UGameFeaturesSubsystem (API) + Lyra Sample Game)

下图是根据 API 中的查询函数和转换函数整理的主干状态:

stateDiagram-v2
  [*] --> Installed: 安装 / 内置
  Installed --> Mounted: Mounting
  Mounted --> Registered: RegisterGameFeaturePlugin
  Registered --> Loaded: LoadGameFeaturePlugin
  Loaded --> Active: Activate
  Active --> Loaded: DeactivateGameFeaturePlugin
  Loaded --> Registered: UnloadGameFeaturePlugin(bKeepRegistered)
  Registered --> [*]: Terminate / Uninstall

图中只画了 API 命名直接对应的状态。官方注释里,IsGameFeaturePluginInstalled/Registered/Loaded 都是「处于该状态或更后」,IsGameFeaturePluginActive 判断是否为 Active,IsGameFeaturePluginMounted 判断是否已越过 Mounting。另外还有中间过渡态和错误态(IsGameFeaturePluginInErrorState)。可以作为目标设置的状态只有四个:UE 5.6 API 中 EGameFeatureTargetState 的取值为 Installed、Registered、Loaded、Active(EGameFeatureTargetState),也就是 ChangeGameFeatureTargetState 能指定的终点。完整的内部状态枚举 EGameFeaturePluginState,在 UE 5.4/5.5 API 中只是 GameFeaturePluginStatePrivate::EGameFeaturePluginState 的 typedef,定义在 GameFeatureTypes.h,文档页没有列出取值(EGameFeaturePluginState),官方 Python API(5.0–5.8)没有这个枚举的页面。下表来自非官方来源:第三方博客(2021-11-17)引用的 UE5 早期访问版源码注释。之后的版本可能有增删,例如 5.8 API 的 DeactivateGameFeaturePlugin 提到了 Terminal 状态,而下表中没有。(UE5: Game Feature Tech Preview,非官方)

状态类型源码注释(意译)
Uninitialized稳定尚未设置
UnknownStatus稳定只知道用于查询状态的 URL
CheckingStatus过渡 UnknownStatus→StatusKnown正在查询状态
StatusKnown稳定已知插件信息,尚未执行任何操作
Downloading / Uninstalling过渡 StatusKnown⇄Installed写入或移除本地存储
Installed稳定插件已在本地存储(硬盘上)
WaitingForDependencies过渡 Installed→Registered加载所有依赖的代码和内容
Mounting / Unmounting过渡 Installed⇄Registered挂载或卸载 pak 等内容文件
Registering / Unregistering过渡 Installed⇄Registered发现资产但不加载(少数用于发现的除外),或清理这些数据
Registered稳定资产已知但未加载
Loading / Unloading过渡 Registered⇄Loaded把代码和内容载入或移出内存
Loaded稳定已在内存中,但还没有注册到游戏系统
Activating / Deactivating过渡 Loaded⇄Active向游戏系统注册或注销
Active稳定完全加载并激活,正在影响游戏

这与官方 EGameFeatureTargetState 一致:只有 Installed、Registered、Loaded、Active 四个稳定状态可以作为目标,其余都是途经的过渡态(这是对照两份来源的归纳)。(UGameFeaturesSubsystem (API) + Lyra Sample Game)

操作官方说明
ChangeGameFeatureTargetState设定目标状态,由状态机自动推进
LoadAndActivateGameFeaturePlugin加载并激活
DeactivateGameFeaturePlugin停用,转到 [Terminal, Loaded]
ReleaseGameFeaturePlugin / TerminateGameFeaturePlugin释放数据 / 移除全部跟踪数据
DetermineBuiltInInitialFeatureState从 .uplugin 描述读取内置插件的初始状态

Lyra 中的用法

官方 Lyra 文档:Content 目录只放通用资产和大厅,核心玩法放在 Game Feature 插件里(例如 ShooterCore、TopDownArena),大多数地图也在插件中。在大厅选择一个体验 (Experience) 后,游戏加载所需的插件。Experience 由 LyraExperienceDefinition 类定义,官方说可以把它看作「高级得多的 GameMode」。Team Death Match 与 Control Points 两个体验都使用 ShooterCore 插件。(UGameFeaturesSubsystem (API) + Lyra Sample Game)Experience 内部如何调用上述子系统 API,没有官方全文来源,不展开。

  1. Game Features and Modular Gameplay in Unreal Engine UE 5.8 文档
  2. UGameFeaturesSubsystem (API) + Lyra Sample Game UE 5.8 API 参考 + UE 5.8 Lyra 文档
  3. EGameFeatureTargetState UE 5.6 API
  4. EGameFeaturePluginState UE 5.5 API
  5. UE5: Game Feature Tech Preview 【非官方】第三方博客引用 UE5 EA 源码

相关页面

游戏开发 · UE5模块、插件与构建系统Modules, Plugins & Build SystemUE 的代码由模块 (Module) 组成:每个模块是一个独立编译单元,用 [模块名].Build.cs 声明依赖。插件 (Plugin) 是可按项目启用/禁用的代码与内容集合,用 .uplugin 描述,可包含多个模块。虚幻构建工具 (UnrealBuildTool, UBT) 根据 .Target.cs 和 .Build.cs(而不是 IDE 的 .sln)编译,默认把模块编成 DLL 由一个可执行文件加载,也可整体链接成单体 (Monolithic) 可执行文件。游戏开发 · UE5Gameplay 框架Gameplay FrameworkGameplay 框架 (Gameplay Framework) 是 UE 提供的一组相互配合的类,用来搭建游戏的基本结构:Actor 与组件 (Component) 构成场景中的一切;GameMode 在服务器上定规则并生成玩家;玩家由“控制器 (Controller) + 棋子 (Pawn)”组成;GameState 与 PlayerState 负责把全局与每个玩家的状态复制给所有客户端;GameInstance 跨关卡存活。游戏开发 · UE5子系统Subsystems子系统 (Subsystem) 是自动实例化、生命周期绑定在宿主对象上的类:Engine、Editor、GameInstance、World、LocalPlayer 五种。宿主创建时自动创建并 Initialize(),宿主关闭时 Deinitialize(),之后无引用即被 GC。它替代了「继承 GameInstance 塞管理器」的老做法,自带按类型的蓝图节点和 Python 访问,特别适合插件。官方编程页只列四种,World 子系统依据 5.8 Python API 补充。游戏开发 · UE5世界分区World Partition世界分区 (World Partition) 是 UE5 的自动数据管理与基于距离的关卡流送 (Level Streaming) 系统:整个世界存为一个持久关卡,按可配置的运行时网格划分为单元格 (Cell),由流送源 (Streaming Source,默认是玩家控制器) 按距离加载/卸载。它配合一 Actor 一文件 (One File Per Actor, OFPA) 支持多人协作编辑,用数据层 (Data Layers) 按玩法状态切换内容,用分层细节层次 (Hierarchical Level of Detail, HLOD) 在远处以代理网格显示未加载的单元格。游戏开发 · 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 做永久缩放。游戏开发组件模式Component Pattern组件模式 (Component Pattern) 让一个实体横跨多个领域(输入、物理、图形、AI……),同时不让这些领域彼此耦合:每个领域的代码放进自己的组件类,实体本身退化为组件的容器。它是现代引擎实体模型的基础,代价是对象变成需要正确装配的一组对象,组件之间如何通信也成了要做的设计决策。

被这些页面引用1 篇

输入关键词开始搜索

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