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++/蓝图通用)

  1. 蓝图节点不超过 80 个:超过就拆函数/宏(蓝图性能那本书有详细分析)。
  2. 逻辑写在蓝图函数库或组件,不写在 Widget/关卡蓝图里。
  3. 事件命名:OnXxx 事件触发,HandleXxx 事件处理。
  4. 布尔正逻辑:用 bIsDead 而不是 bNotAlive。
  5. 魔法数字外置:伤害/冷却/数量全部走数据表 DT_,不写死。

常见坑与解法

坑 1:重名资产导致迁移冲突

原因:两个目录都有 W_HUD。

解法:模板前缀 + 目录即命名空间;遇冲突用 Rename 而不是删了重建。

坑 2:规范有了但没人守

解法: - 写个扫描脚本(EditorUtilityWidget):扫不符合命名前缀的资产,每次里程碑跑一遍。 - 新人/外包进项目时第一件事就是过一遍规范(10 分钟)。

坑 3:命名规范改来改去

原则:先小后稳。第一版规范盖住 80% 即可,三个月内允许增量修订,之后冻结。规范的价值在稳定,不在完美。

相关节点速查

  • 资产命名:内容浏览器右下角的 Search/Filter 可以按前缀过滤
  • 批量改名:编辑器自带 Rename 或 Asset Registry 脚本(本系列编辑器工具那本书)

心得:我们项目中期来了个兼职程序,因为我有一页命名规范,他第一天就能独立产出符合风格的资产。规范省的不是"美观",是沟通成本。没有规范,代码只能一个人维护到死。