Unity 代码规范
适用于 Project2 Unity 客户端的 C# 代码开发。目标是让代码可读、稳定、可复用,减少回归风险并提高 handoff 质量。
1. 适用范围
- 适用于 Unity 客户端全部脚本、编辑器扩展、测试辅助脚本。
- 不适用纯热更新配置脚本(仅做数据定义),但该脚本也建议遵守本文命名与注释风格。
- 本规范优先级:
项目内已有实现风格> 本文 > 个人偏好。
2. 命名规范
2.1 类与接口
- 类名使用
PascalCase,以职责命名(如LevelLoadCoordinator)。 - 接口名必须以
I开头(如IStateMachineNode)。 - 脚本名与主类名保持一致。
- 组件类建议带语义后缀:
Manager:状态/生命周期管理器。Controller:输入、流程、UI/场景控制。Model:仅承载状态与数据转换。Service:跨场景服务。
2.2 成员命名
- 字段优先级:
private字段用_camelCase(如_levelId),public与serialized字段用PascalCase或保持 Inspector 对应含义。 - 常量使用
UPPER_SNAKE_CASE或PascalCase(仓库统一一种即可,禁止混杂)。 - 布尔值应以
Is/Has/Can/Should开头。 - 协程方法用动词现在分词命名(如
LoadLevelAsyncRoutine可接受,推荐LoadLevelAsync,并在调用处注释)。
2.3 枚举与方法
- 枚举项使用
PascalCase。 - 方法名使用动词开头,避免与字段同名。
- 同步方法与异步方法分别体现差异(如
LoadConfig/LoadConfigAsync)。 - 回调类型参数命名含事件语义(如
OnSceneEnter)。
3. 目录与文件组织
- 一个脚本文件只放一个主类,特殊情况下可放同名子类作为内部私有结构。
- 文件夹按职责分层:
Runtime/:游戏运行时脚本。UI/:界面相关逻辑。Data/:配置、模型、解析逻辑。Services/:跨系统服务。Editor/:编辑器工具脚本。
- 禁止把临时脚本、一次性测试脚本留在运行时代码目录。
4. 生命周期与事件管理
Awake仅做基础字段初始化与引用缓存,不应触发异步流程。OnEnable/OnDisable只做事件订阅和取消订阅。Start/OnStart进行首次轻量初始化,不应包含重度计算。Update/LateUpdate/FixedUpdate只保留高频更新逻辑,避免复杂判断链和大内存分配。- 使用
UnityEvent/ C# 事件时,必须在OnDisable/OnDestroy中移除监听,禁止匿名委托导致泄露。
5. 性能与内存约束
- Update 内禁止
GetComponent、FindObjectOfType、FindObjectsOfType、LINQ 大规模查询。 - 避免每帧
new大对象、string.Concat拼接、装箱、Lambda 捕获大对象。 - 对
List、Dictionary访问采用对象池或复用缓存集合。 - 频繁调用
ToList()、Select().ToArray()属于高风险行为,需要改造。 - 非必须不要在循环里
GetComponent<T>()。 - 资源异步加载避免在单帧内发起过量请求。
6. 并发与异步
- 同一职责避免嵌套大量回调,优先用
async/await(或统一协程约定)封装。 - 异步任务失败必须记录原因与恢复路径,不允许“吞掉异常后继续执行”。
- 需要取消的异步流程必须持有
CancellationToken或状态标记,并明确终止条件。 - 超时与重试策略要有日志输出和上报。
7. 错误处理与日志
- 业务可恢复错误:记录
Warn+ 用户可见提示策略。 - 关键流程错误:记录
Error,附带关键信息(角色/关卡/用户/配置版本/资源路径)。 - 禁止使用
print进行业务日志。 - 日志中禁止输出账号完整信息和 token,严格脱敏。
8. 代码审阅红线(必须项)
- 禁止
GameObject.Find在热路径中调用。 - 禁止在
Update中动态创建/销毁大量临时对象。 - 禁止
UnityEngine.Random的非确定性结果影响玩法公平结算。 - 禁止魔法字符串直接写 UI 文案 key,统一走文案常量或配置。
- 禁止与业务逻辑同层混入渲染/播放特效细节,必须分层处理。
9. 可测性要求
- 公开行为入口需便于 mock 或脚本注入依赖,减少
static强耦合。 - 关键业务逻辑需有单元测试骨架(至少覆盖边界条件和失败场景)。
- 与配置版本相关逻辑必须有版本对齐测试,防止旧版本数据导致行为歧义。
10. 文档与交付
- 每个新模块需要提供:
- 职责说明(1-3 行)
- 关联配置与依赖
- 关键生命周期点(Load/Enter/Exit/Dispose)
- 主要回归场景和失败恢复策略
执行检查清单(MR 级)
- 生命周期方法职责拆分正确,无污染性副作用
- 更新循环中无高频反模式(查找/获取组件/动态分配)
- 事件监听成对注册与解绑
- 异常路径可观测(日志 + 失败动作)
- 关键模块具备基础回归测试