总览
Game Features 不是“再写一种插件”。普通 UE 插件解决的是模块、内容和依赖;Game Features 解决的是一个玩法包能不能被发现、注册、加载、激活、停用、卸载、回滚。Modular Gameplay 则解决另一个问题:玩法包激活后,怎么把组件、输入、UI、技能、数据表挂到已经存在的 PlayerController、Pawn、PlayerState、GameState 上,而不是改一堆基类。
一句话心智模型:Game Features 管包的生命周期,UGameFeatureData 管这个包激活时要做哪些事,UGameFeatureAction 执行这些事,UGameFrameworkComponentManager 把组件和扩展事件投递给愿意被扩展的 Actor。
运行时总入口是 UGameFeaturesSubsystem。项目代码、控制台命令和默认 Project Policy 最终都会通过它找到插件 URL、创建状态机、推进 Registered/Loaded/Active 等目标状态。
专题分篇目录
| 篇章 | 你会学到什么 | 读完能做什么 |
|---|---|---|
| 一 | 先做一个可开关的武器包插件 | 建 Game Feature 插件,配置 GameFeatureData,用控制台加载和停用 |
| 二 | .uplugin、GameFeatureData 与目录结构 | 明白 BuiltInInitialFeatureState、Actions、PrimaryAssetTypesToScan 和依赖边界 |
| 三 | 状态机、URL 与运行时启停 | 用 Subsystem API/控制台命令管理 Installed、Registered、Loaded、Active |
| 四 | GameFeatureAction 家族怎么选 | 会选 AddComponents、DataRegistry、WPContent、Cheats、Chunk、Iris 等动作 |
| 五 | Add Components 与 Actor 扩展 | 让 Pawn/Controller/State 被玩法包动态加组件 |
| 六 | Init State 初始化状态链 | 用 GameplayTag 状态让组件按顺序准备好,避免 BeginPlay 互相抢 |
| 七 | 像 Lyra 一样注入输入、UI 和 GAS | 把 Enhanced Input、Common UI、AbilitySet 做成可插拔玩法 |
| 八 | 资源扫描、AssetBundle、Cook 和 DLC | 管理 Primary Asset、Client/Server Bundle、软引用和打包边界 |
| 九 | World Partition、DataRegistry、Iris 与其它扩展 | 给地图内容、数据表、网络过滤、调试作弊做模块化接入 |
| 十 | 自定义 GameFeatureAction | 写自己的动作,处理激活/停用、World、异步和清理 |
| 十一 | 调试、多人、回滚和生产规范 | 用命令、日志、Dump 和检查清单把模块化玩法安全上线 |
它适合解决什么问题
适合:赛季玩法、武器包、地图包、活动模式、角色职业、技能包、教程系统、运营热修补、内部测试菜单、DLC 内容、平台差异功能。它们有共同特点:不是所有场景都需要、生命周期独立、资源边界清楚、希望能停用或回滚。
不适合:角色移动、全局存档、基础网络协议、核心输入抽象、全项目都永远依赖的框架。那些更适合普通模块或主工程代码。
UE5.8 里的真实构成
| 插件 | UE5.8 状态 | 负责什么 |
|---|---|---|
GameFeatures | Runtime,PreDefault,Beta,默认不启用 | GFP 状态机、GameFeatureData、Action、Project Policy、控制台命令 |
ModularGameplay | Runtime,PreDefault,Beta,默认不启用 | Component Manager、Receiver、Extension Event、Init State |
AbilitySystemGameFeatureActions | Runtime,Beta,默认不启用 | 给 GAS Attribute Defaults 做 Game Feature Action |
| Lyra 自带 Actions | 示例项目代码 | AddAbilities、AddInputContextMapping、AddWidget、WorldActionBase 等项目级扩展 |
推荐项目骨架
Plugins/GameFeatures/WeaponPack_Rifle/
WeaponPack_Rifle.uplugin
Config/
Content/
DA_GameFeatureData_Rifle
Weapons/
Input/
UI/
Abilities/
Source/
WeaponPack_RifleRuntime/
项目主工程里保留基础角色、基础 Controller、基础 ASC、基础 UI Layer、基础 Asset Manager 配置。具体步枪玩法、榴弹玩法、节日活动玩法进入 Game Feature 插件。这样一个玩法能像“包”一样激活,也能在失败时拆回去。
源码依据
GameFeatures.uplugin 描述它是 modular Game Feature Plugins 的支持插件,依赖 ModularGameplay 和 DataRegistry。UGameFeatureData 继承 UPrimaryDataAsset,包含 Actions 和 PrimaryAssetTypesToScan。UGameFeatureAction 定义 Registering、Loading、Activating、Activated、Deactivating、Unloading、Unregistering 等回调。UGameFrameworkComponentManager 是 UGameInstanceSubsystem,负责给 opt-in 的 Actor 自动挂组件和发送扩展事件。
常见坑
- 以为 Game Feature 会魔法般改所有 Actor;实际上 Actor 必须通过 Receiver 或项目约定主动接入。
- 把核心系统拆成 Game Feature,结果主工程启动顺序被玩法包绑死。
- 只写激活逻辑,不写停用清理,热切换一次后留下输入、UI、Ability 或组件残留。
- 把 Lyra 的项目级 Action 当成引擎内置功能;Lyra 很有参考价值,但很多 Action 是示例项目自己写的。
- 忘记 Client/Server 资源和组件差异,Dedicated Server 加载了纯 UI 资源。
源码路径索引
Engine/Plugins/Runtime/GameFeatures/GameFeatures.upluginEngine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Public/GameFeatureData.hEngine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Public/GameFeatureAction.hEngine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Public/GameFeaturesSubsystem.hEngine/Plugins/Runtime/GameFeatures/Source/GameFeatures/Private/GameFeaturePluginStateMachine.hEngine/Plugins/Runtime/ModularGameplay/Source/ModularGameplay/Public/Components/GameFrameworkComponentManager.hSamples/Games/Lyra/Plugins/GameFeatures/ShooterCore/ShooterCore.uplugin