原则:可读性优先;团队一致;规则随项目更新;先写对,再写干净。
1. 命名
- 使用有意义、可读、可搜索、可发音的名称,避免随意缩写。
- 变量用名词;布尔变量用动词前缀:
isDead、hasDamage。 - 类型名避免过泛:用
PhysicsSolver,不用Solver。 - 避免冗余名:类
Player中直接用Score,不用PlayerScore。 - 避免 snake_case、kebab-case、匈牙利命名法。
2. 大小写与前缀
- 类型、方法、属性、公共字段、枚举:PascalCase。
- 局部变量、参数、私有变量:camelCase。
- 文件中有 MonoBehaviour 时,文件名必须与类名一致。
- 私有成员前缀团队三选一,并保持一致:
m_成员 /s_静态 /k_常量;_前缀;- 不加前缀。
- 删除冗余初始化:
int = 0、引用类型= null不必写。 - 访问修饰符保持一致;推荐显式写
private。
3. 格式与空格
- 大括号风格二选一:K&R 或 Allman,团队统一。
- 行宽建议 ≤120 字符;长行拆成短语句。
- 流程控制条件前一个空格:
while (x == y)。 - 括号内不加空格:
dataArray[index]。 - 参数逗号后一个空格:
CollectItem(a, 0, 1); - 函数名与括号之间不加空格:
DropPowerUp(...)。 - 比较运算符前后加空格。
- 多数情况一行一个变量声明。
4. 注释
- 只在代码不能自解释时注释。
- 重点解释 “为什么”,不是“是什么/怎么做”。
- 优先重命名,再考虑注释;复杂逻辑考虑重构。
- 序列化字段需解释时用
[Tooltip],不写普通注释。 - 公共方法前用 XML
<summary>。 - 不写署名注释;用版本控制追踪变更。
- 不鼓励用
#region隐藏复杂度。
5. 类组织顺序
- 字段
- 属性
- 事件
- MonoBehaviour 方法(Awake/Start/OnEnable/OnDisable/OnDestroy 等)
- 公共方法
- 私有方法
- 其他类
6. using 与命名空间
using放文件顶部;删除未使用项,保留最小必需集合。- 命名空间用 PascalCase,不加特殊符号/下划线。
- 子命名空间用点号:
MyApplication.GameFlow。 - 可让命名空间反映文件夹结构。
7. 枚举、接口、类
- 枚举:PascalCase;名称用单数名词;不加前后缀。
- Flags 枚举:用复数名词;二进制值可列对齐,或用
1 << n。 - 接口:以
I开头,后接形容词短语,如IDamageable。 - 类/结构体:PascalCase;用名词或名词短语;避免前缀。
- 一个文件一个 MonoBehaviour。
8. 字段、属性、事件、方法
字段
- 名词命名;布尔用动词前缀。
- 公共字段 PascalCase;私有变量 camelCase。
- Inspector 显示私有字段用
[SerializeField]。 - 范围限制用
[Range],说明用[Tooltip]。
属性
- 属性优先于公共字段。
- PascalCase;只读可用表达式体;其他用
{ get; set; },团队统一。 - 复杂 get/set 逻辑改用方法。
事件
- 动词短语命名;现在分词表示“之前”,过去分词表示“之后”。
- 多数用
System.Action;必要时自定义 EventArgs。 - 事件触发方法用
On前缀:OnDoorOpened。 - 事件处理方法可用
Subject_Event命名。
方法
- 动词或动词短语开头:
GetDirection、FindTarget。 - 返回 bool 的方法用问题式:
IsGameOver、HasStartedTurn。 - 参数 camelCase。
- 避免过长方法、过多参数(>3 考虑封装)、过度重载、副作用。
- 避免用 flag 让一个方法多模式工作,拆成命名明确的方法。
9. var、switch、大括号
- 类型从上下文清晰时可用
var;foreach中推荐var。 - 长
if-else链优先改switch;格式团队统一。 - 大括号尽量不省略,即使单行;嵌套多行必须保留。
- 单行语句建议写成多行,便于调试。
Unity爱好者