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. 外包协作的边界
美术/兼职程序只需要"装上这三个插件"就能参与,不需要全项目源码。插件接口就是团队边界。
怎么切:实践步骤
- 在每个系统稳定一两次迭代后再切(原型期别急着插件化,移动文件很烦)。
- 用
Edit -> Plugins -> New Plugin起模板(建议 Blueprint Library 或 Empty)。 References要在.uplugin里声明依赖(写到Modules的Dependencies)。- 移动资产时用
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 时不怕碰坏战斗。插件是独立开发者的"分工工具",即使只有你一个人。
