1.3 插件化工程结构:独立项目的续命丹

核心结论

独立项目看似"一个人写, Structure 无所谓",恰恰相反——插件化是独立项目的续命丹:每个大系统一个插件,可以单独启停、单独复用到下一个项目、单独丢给外包美术。两小时学会,救一年。

我的插件划分

插件 内容 类型 依赖
CoreFramework GameMode/存档接口/事件总线 Runtime 无
CombatSystem(GAS 封装) ABP/GA/GE/数据表 Runtime Core
InputSystem IMC/IA/映射 Runtime + Editor Core
VFXFeedback Niagara 与音效反应器 Runtime Core
AISystem 行为树/感知/任务结点 Runtime Core
UISystem UMG 基类与工具 Runtime Core
WorldSystem 刷怪/掉落/任务 Runtime Core
DevTools 作弊/性能批处理 EditorOnly 无

EditorOnly 插件(DevTools)是精髓:发布编译时根本不进包,但开发期提供作弊命令(加钱/跳关/显示伤害),是调试利器(怎么写见本系列编辑器工具那本书)。

插件化的三个实际收益

1. 系统可替换

M1 用了简单的 BT AI,M3 想换 State Tree——因为 AI 在独立插件里,直接新建插件迁移,旧插件留着,切换只用改 GameMode 一行配置。敢换 = 敢学。

2. 下一个项目直接拷贝

CoreFramework + InputSystem + UISystem 与《回廊》的具体玩法无关——下一个项目拷贝这三个插件,从第 3 个月开始,而不是从第 0 个月。

3. 外包协作的边界

美术/兼职程序只需要"装上这三个插件"就能参与,不需要全项目源码。插件接口就是团队边界。

怎么切:实践步骤

  1. 在每个系统稳定一两次迭代后再切(原型期别急着插件化,移动文件很烦)。
  2. 用 Edit -> Plugins -> New Plugin 起模板(建议 Blueprint Library 或 Empty)。
  3. References 要在 .uplugin 里声明依赖(写到 Modules 的 Dependencies)。
  4. 移动资产时用 Move(保留引用),别用剪切。

插件结构在编辑器里几乎透明——内容浏览器里一样浏览,只是按插件目录组织。

常见坑与解法

坑 1:插件间循环依赖报错

原因:A 插件依赖 B,B 又依赖 A。

解法:按 0102 的分层图声明依赖;循环的部分抽到更下层的公共插件。

坑 2:资产移动后引用断

解决方法:用编辑器的 Move(自动修复引用);移动前 File -> Fix Up Redirectors。

坑 3:插件里 C++ 与蓝图混合编译慢

解法:热重载(Live Coding)只在改 C++ 时需要;纯蓝图迭代快。小项目把"频繁改动"的部分放蓝图(本系列蓝图 C++ 混合那本书的主题)。

坑 4:EditorOnly 插件忘了加标识

后果:发布时包含作弊命令。

解法:.uplugin 的 Module 的 Type 设为 Editor,并在 CI 打包前自检(脚本扫 uplugin 的 Type)。

相关节点速查

  • 新建插件:Edit -> Plugins -> New Plugin
  • 依赖声明:你的插件 .uplugin 文件的 Modules -> AdditionalDependencies(写「插件名.uplugin」即可)
  • 插件蓝图:https://www.wanxiangyundang.top/read/unreal-engine-5-8-docs/blueprints-visual-scripting-us-a68a 的蓝图类资产页面(解释蓝图资产的归属)

心得:我把《回廊》切成 8 个插件后,最直观的变化是"心理负担下降"——改 AI 时不怕碰坏战斗。插件是独立开发者的"分工工具",即使只有你一个人。