1.4 命名规范与编码约定:五人团队的文字契约
核心结论
独立项目最容易省略的就是命名规范——"反正我自己写"。但三个月后、外包进场后、代码 Review 时,命名规范就是唯一的沟通语言。 UE 的前缀规范(A/U/S/E/I)是现成的,跟着走几乎没有争议。
我的项目命名约定(一页纸版)
前缀(沿用 UE 官方)
| 前缀 | 用于 | 例 |
|---|---|---|
A |
Actor 派生 | ARogueEnemy |
U |
Object/组件 | UCombatComponent |
I |
接口 | IInteractable |
E |
枚举 | EDamageType |
S |
Slate UI | SComboWidget |
F |
结构体/普通类 | FAttackData |
W |
UMG Widget | W_PlayerHUD |
模板前缀(资产命名,对内容浏览器排序友好):
| 前缀 | 资产 | 例 |
|---|---|---|
GA_ |
Gameplay Ability | GA_Fireball |
GE_ |
Gameplay Effect | GE_Poison |
IMC_ |
Input Mapping Context | IMC_Default |
IA_ |
Input Action | IA_Attack |
NS_ |
Niagara System | NS_HitSlash |
BT_ |
行为树 | BT_BossPhase2 |
W_ |
UMG | W_HUD |
DT_ |
数据表 | DT_LootTable |
L_ |
关卡 | L_Dungeon_01 |
目录结构
Content/
├─ /Game/Characters -- 角色蓝图与 ABP
├─ /Game/Abilities -- GA/GE/数据表
├─ /Game/Input -- IMC/IA
├─ /Game/VFX -- Niagara
├─ /Game/AI -- BT/BB/感知配置
├─ /Game/UI -- UMG
├─ /Game/World -- 关卡与刷怪
└─ /Game/Core -- GameMode/SaveGame/接口
规则:每个目录下最多两级子目录,目录命名用复数(Characters 不用 Character)。
编码约定(C++/蓝图通用)
- 蓝图节点不超过 80 个:超过就拆函数/宏(蓝图性能那本书有详细分析)。
- 逻辑写在蓝图函数库或组件,不写在 Widget/关卡蓝图里。
- 事件命名:
OnXxx事件触发,HandleXxx事件处理。 - 布尔正逻辑:用
bIsDead而不是bNotAlive。 - 魔法数字外置:伤害/冷却/数量全部走数据表
DT_,不写死。
常见坑与解法
坑 1:重名资产导致迁移冲突
原因:两个目录都有 W_HUD。
解法:模板前缀 + 目录即命名空间;遇冲突用 Rename 而不是删了重建。
坑 2:规范有了但没人守
解法: - 写个扫描脚本(EditorUtilityWidget):扫不符合命名前缀的资产,每次里程碑跑一遍。 - 新人/外包进项目时第一件事就是过一遍规范(10 分钟)。
坑 3:命名规范改来改去
原则:先小后稳。第一版规范盖住 80% 即可,三个月内允许增量修订,之后冻结。规范的价值在稳定,不在完美。
相关节点速查
- 资产命名:内容浏览器右下角的 Search/Filter 可以按前缀过滤
- 批量改名:编辑器自带
Rename或 Asset Registry 脚本(本系列编辑器工具那本书)
心得:我们项目中期来了个兼职程序,因为我有一页命名规范,他第一天就能独立产出符合风格的资产。规范省的不是"美观",是沟通成本。没有规范,代码只能一个人维护到死。
