Unity 开发规范

Unity 开发规范

当前版本修订时间:2021-04-13
除另行约定,所有Unity 项目开发均需按如下规范执行。

一、 开发流程规范
1.开发更新流程。规范等级 D
当前开发版开发->当前开发版本自测试通过->合并代码到发布版本->在发布版本中自测试通
过->给主管审核->提交代码到发布版本->转给质检

2.发布版本 BUG 修改流程。规范等级:C
优先在发布版本修改。
在当前发布版本上直接修改 BUG->自测试通过->主管审核->提交内容到发布版本->转给质检
->将修改内容回改到当前开发版本->自测试通过->将内容提交到当前开发版本

3.开发自测要求。规范等级:C
程序需对开发过程中编写的代码,进行分支覆盖测试,绝对不能将未测试的代码提交,或者
直拉丢给质检测试,这是严重不负责任的行为。因为质检测试的范围有限,有可能很难重现
所有分支。势必导致未经测试的功能提交外网,造成巨大的风险。
同时在提交质检时,尽可能将测试方法写出来,方便质检测试。
4.正式版本发布要求。规范等级:A
1). 发布正式版本前必须解决完日志系统收集到的所有错误日志。
2). 正式版本必须正确设置错误日志采集系统的外网地址(鉴于之前多次出现地址配置未更
改导致无法收集外网错误的情况)。
二、 开发规范细则

  1. 编码(引擎相关)
    100 禁止通过 new 的方式实例化 MonoBehaviour 的派生类,否则无法得到引擎有效的管理。
    规范等级 S
    120 禁止逐帧对 Find, GetComponent 等引擎接口族调用。如有此类需求,须将结果缓存供后续使用。规范等级 A
    121 禁止逐帧对 GameObject.transform 属性的访问。如有此类需求,须将 transform 的引用缓存。规范等级 A
    122 必须使用 GetInstanceID 代替 UnityEngine.Object 引用进行比较或作为散列表数据类型如Dictionary 和 HashSet 的 key。 规范等级 A
    123 当设置 GameObject 对象之间的父子关系时,如果仅关注逻辑上的层次关系而无需保持
    子对象的空间方位,则应使用 SetParent(parent, false)避免空间转换的性能消耗。 规范等级A
    124 代码中需要访问到 Transform 组件的位置数据时,尽可能使用 localPosition 代替对
    position 属性的访问。规范等级 A

125 尽可能避免使用协程。Unity 的协程使用迭代器实现会分配堆内存。规范等级 A
126 尽可能避免使用 MeshCollider 组件。如有此类需求也应尽可能减少网格碰撞体的面数,
或者使用 Sphere、Box 和 Capsule 的组合来替代之。规范等级 A
127 使用导航网格时,应尽可能避免使用 Obstacle 模拟动态障碍物,否则对 CPU 性能冲击很大。如有此需求建议使用碰撞体代替。规范等级 A
140 禁止使用接受字符串参数的 GetComponent 重载方法。规范等级 B
141 禁止在 MonoBehaviour 的派生类中存在被引擎高频回调的空方法,如:Update、
LateUpdate 和 FixedUpdate 等。规范等级 B
142 必须使用 CompareTag (gameobject.ComparTag("Cube"))接口比较 Unity GameObject 的 Tag。CompareTag是GameObject中定义的一个方法可以直接进行比较
而.tag作为GameObject中的属性先要get,set一遍然后再通过字符串进行比较,所以多花了时间。规范等级 B
143 避免在 MonoBehaviour 的派生类中存在 Awake、Start、OnEnable、OnDestroy 等空方法。规范等级 B
144 Unity 的矢量运算消耗较高,若存在矢量与标量的混合运算,必须尽可能将标量合并运
算完后再与矢量进行计算。如 A * b * c * d(其中大写字母为矢量,小写字母为标量)应调整为 A * (b * c * d)。规范等级 B
145 尽可能减少 UnityEngine.Object 的 null 比较。规范等级 B
160 建议合理使用 OnBecameInvisible、OnBecameVisible、OnWillRenderObject 类似的引擎回调来避免不必要的渲染和计算。规范等级 C

  1. 编码(引擎无关。未尽之处参见编码规范文档)
    200 必须对可能造成功能失效的,影响流程的代码块添加异常捕获。规范等级 S
    201 禁止高频的字符串拼接。如无法避免,必须使用 StringBuilder 代替“+”操作符进行字符串进行拼接。规范等级 S
    120 尽可能将 CPU 占用高的逻辑代码分帧处理平摊 CPU 压力。规范等级 A
    221 尽可能将计算量较大的运算放到子线程中进行,避免阻塞主线程(比如寻路等算法)。
    规范等级 A
    222 Delegate 回调方法必须适时的解注册,否则回调方法所属的对象是会被一直引用,继而
    会引起该对象所引用到的资源无法得到释放。 规范等级 A
    240 尽量避免使用反射。 规范等级 B
    241 尽量避免使用可变数量参数(param object[] args),避免装箱拆箱。 规范等级 B
    242 禁止没有计算需求的变量赋值或者计算。 规范等级 B
    243 简单条件判断尽量使用三目运算符:b ? x : y。 规范等级 B
    244 注意 List 等容器常用接口复杂度,尽可能尾移除,批量移除 RemoveRange 等。规范等级B
    145 在频繁查询数据列表时,建议使用 Hashset、Hashtable 查找时间复杂度低的数据结构,
    避免使用 List。规范等级 B
    246 尽可能为快速产生和消灭的大量对象建立缓冲池。规范等级 B
    260 使用可变长容器时,建议根据预估容量进行初始化。规范等级 C
    261 循环中寻找符合的条件应该适时的使用 break 跳出。 规范等级 C
    262 尽可能将一些内存占用低但为数众多、功能简单的小对象定义为结构体(struct)而非
    类(class)。规范等级 C
    263 尽可能减少函数调用栈,用 x = (x > 0 ? x : -x);代替 x = Mathf.Abs(x)。规范等级 C
    264 尽可能将类或函数声明为 sealed,IL2CPP 会对 sealed 的类或函数进行优化,变虚函数调用为直接函数调用。规范等级 C

  2. UI
    320 禁止非图集贴图资源不合理的留白。会影响 UGUI 运行时自动合批。规范等级 A
    321 资源设置 UI 的贴图资源禁止勾选 Generate Mip Maps。规范等级 A
    322 禁止使用修改 Alpha 值的方式来隐藏界面。规范等级 A
    323 尽可能降低 Release 版中图集留白,提高贴图利用率。规范等级 A
    324 尽可能将图集中大的图片改为底图加载。规范等级 A
    340 建议同一 Canvas 中使用到的图集数量控制在三个以内。规范等级 B
    360 建议合理规划公共图集。在内存占用、加载频度和引用复杂度间确定合理的平衡点。规
    范等级 C

  1. 渲染
    400 禁止匿名 GrabPass。如需使用到 GrabPass 必须命名并尽可能复用。规范等级 S
    420 游戏发布时必须将游戏锁定至合适的帧率(建议 30 帧)。规范等级 A
    421 Shader 中尽可能减少多 Pass 渲染,除非必须这么做。规范等级 A
    422 尽可能降低 Release 版中 Shader 中 Keyword 数量。规范等级 A
    423 尽可能降低 SkinnedMeshRenderer 组件的数量。 规范等级 A
    441 禁止逐帧直接使用名称对 Shader Uniform 量进行更新。规范等级 B
    442 尽量避免在 Shader 中使用复杂的计算如:pow,sin,cos,tan,log 等。规范等级 B
    443 建议在 Shader 中采用预混合或实时混合纹理的方式代替实时地多次纹理采样。规范等
    级 B
    444 移动平台的 Shader 编码一定要考虑到数据精度(float/half/fixed)的合理使用。规范等级 B
    445 应尽可能减少每帧 Material.GetXX/Material.SetXX 的次数,比如把多个 uniform half 变量合并为 uniform half 4。规范等级 B

  2. 动画
    540 尽可能避免将 Animator 的 CullingMode 属性设置为 Always,对于不使用 RootMotion 的项目建议选择 CullCompletely。规范等级 B

  1. 物理
    640 尽可能避免使用物理引擎。建议自行编码模拟物理效果。规范等级 B
    641 使用物理模块的游戏,建议在 PhysicsManager 中设置矩阵,会有较大的性能提升。规
    范等级 B

  2. 音频
    720 如使用第 3 方音频插件,需禁用 FMOD 模块(Edit->Project Settings->Audio->Disable Unity
    Audio)。规范等级 A
    740 若不需要立体音效,音频导入设置需勾选 Force to Mono(注:制作音频时就应该按照单通道制作)。规范等级 B

  1. 资源
    820 音频格式:IOS/Android 平台一般使用 mp3。规范等级 A
    821 无需由逻辑代码访问的渲染资源禁止勾选 Read/Write Enabled,如网格和贴图。规范等级 A

822 导入蒙皮网格模型时建议开启 Optimize GameObject 优化选项,可极大的降低骨骼层次复杂度,优化 CPU 性能。规范等级 A
823 无动作模型资源导入必须将 Animation Type 设置为 None。否则会导致游戏对象挂载不必要的动画脚本,大量的话会严重影响消耗 CPU 计算。规范等级 A
824 导入的模型如果无需用到法线和切线,必须将导入设置中的 Normals 和 Tangents 选项设置为 None。规范等级 A
825 导入的模型如果无需参与 Unity Lightmap 烘焙,必须将导入设置中的 Generate Lightmap UVs 选项设置为 None。规范等级 A

  1. 发包
    900 禁止在 Release 版中存在任何 OnGUI 相关代码。规范等级 S
    901 禁止在 Release 版中存在任何日常调试相关的 UnityEngine.Debug 类日志输出。规范等级S
    902 禁止在 Release 版中开启"Development Build"和"Script Debugging"选项。规范等级 S
    923 禁止在 Release 版中使用引擎提供的 SendMessage 方法。规范等级 A
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,651评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,468评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,931评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,218评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,234评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,198评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,084评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,926评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,341评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,563评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,731评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,430评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,036评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,676评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,829评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,743评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,629评论 2 354

推荐阅读更多精彩内容

  • 介绍 本套开发规范来自 unity 官方的一个开放项目[https://docs.google.com/docum...
    烂醉花间dlitf阅读 1,674评论 0 6
  • .Net 开发规范一、C# 编码规范1. 代码组织与风格1.1. Tab要使一个Tab为4个空格长。1.2. 缩进...
    PowerYangSoft阅读 3,962评论 0 3
  • 文档版本说明v1.0 基础版本v1.1 补充规范,增加规范等级 一、代码流程规范 (一) java代码处理 【强制...
    tonyZj阅读 966评论 0 2
  • 前言 本开发规范基于《阿里巴巴Java开发手册终极版》修改,并集成我们自己的项目开发规范,整合而成。 为表示对阿里...
    4ea0af17fd67阅读 5,640评论 0 5
  • 前言 说是前言,其实也是本文诞生的目的。随着公司业务的不断增加,功能的快速迭代,app的业务线越来越多,代码体积变...
    梦翔_d674阅读 1,493评论 0 2