Unity開發規范(綜合)


開發代碼

  1. 編碼(Unity 引擎相關)

    • 規范等級 S
      100. 禁止通過 new 的方式實例化 MonoBehaviour 的派生類, 否則無法得到引擎的有效管理.
      101. 禁止在 Update/FixedUpdate/LateUpdate/OnGUI 等頻繁調用的邏輯中使用協程.
      102. 禁止使用 Resources.Load 加載資源, 個別情況除外.
      103. 禁止使用 LINQ 表達式.

    • 規范等級 A
      120. 禁止使用 Invoke("MethodA", 2) 來實現延時調用.
      121. 禁止逐幀使用 Find/GetComponent 等引擎接口調用, 如有此類需求, 應該將結果緩存供后續使用.
      122. 必須使用 GetInstanceID() 獲得的 int 值代替 UnityEngine.Object應用進行比較或作為散列表數據類型.
      如 Dictionary 和 HashSet 的 key.
      123. 當設置 GameObject 對象之間的父子關系時, 如果僅關注邏輯上的層次關系而無需保持子對象的空間方位, 則應該使用SetParent(parent, false) 避免空間轉換的性能消耗.
      124. 代碼中需要訪問到 Transform 組件的位置數據時, 盡可能使用 localPosition 代替對 position 屬性的訪問.
      125. 盡可能避免使用協程. Unity 的協程是使用迭代器實現的會分配堆內存.
      126. 盡可能避免使用 MeshCollider 組件. 如有此類需求也應盡可能減少網格碰撞體的面數. 或使用 Sphere/Box/Capsule 的組合來代替.
      127. 使用網格導航時, 應盡可能避免使用 Obstacle 模擬動態障礙物, 否則對 CPU 性能沖擊很大. 如有此類需求建議使用碰撞體代替.

    • 規范等級 B
      140. 禁止使用接受字符串參數的 GetComponent 重載方法.
      141. 禁止在 MonoBehaviour 的派生類中存在被引擎高頻調用的空方法, 如 Update里沒有方法內容就應該刪掉.
      142. 禁止在 MonoBehaviour 的派生類中存在 Awake/Start/OnEnable/OnDestory 等空方法.
      143. 必須使用 CompareTag 接口比較 GameObject的Tag.
      144. 盡可能減少 UnityEngine.Object null 比較.

    • 規范等級 C
      160. 建議合理使用 OnBecameVisible/OnBecameInvisible/OnWillRenderObject 類似的引擎回調以避免不必要的渲染和計算.

  2. 編碼(引擎無關)

    • 規范等級 S
      200. 必須對可能造成功能失效, 影響流程的代碼塊添加異常捕獲.
      201. 禁止高頻的字符串拼接. 如無法避免, 必須使用 StringBuilder 代替 "+" 操作符進行字符串拼接.

    • 規范等級 A
      220. 盡可能將 CPU 占用高的邏輯代碼分幀處理平攤 CPU 壓力.
      221. 盡可能將計算量較大的運算放到子線程中進行, 避免阻塞主線程(如尋路等算法).
      222. Delegate 回調方法必須適時的解除注冊, 否則回調方法所屬的對象會一直有引用計數, 繼而引起該對象所引用的資源無法得到釋放.

    • 規范等級 B
      240. 盡量避免使用 Reflection(反射).
      241. 盡量避免使用可變參數(param object[] args), 避免裝箱拆箱.
      242. 禁止沒有計算需求的變量賦值或計算.
      243. 簡單條件判斷盡量使用三目運算符: b?x:y.
      244. 注意 List 等容器常用接口的復雜度, 盡量從尾部移除/批量移除(RemoveRange)等.
      245. 在頻繁查詢數據列表時, 建議使用 HashSet/HashTable 查找時間復雜度低的數據結構, 避免使用 List.
      246. 盡可能為快速產生和消滅的大量對象建立緩沖池.

    • 規范等級 C
      260. 使用可變長容器時, 建議根據預估容量進行初始化.
      261. 循環中尋找到符合條件后應該適時地使用 break 跳出循環.
      262. 盡可能將一些內存占用低但為數眾多/功能簡單的小對象定義為 struct(結構體) 而非 class(類).
      263. 盡可能減少函數調用棧, 如使用 x = (x > 0 ? x : -x); 代替 x = Mathf.Abs(x).
      264. 盡可能將類或函數聲明為 sealed, IL2CPP 會對 sealed 的類或函數進行優化, 變虛函數調用為直接函數調用.

  3. UI

    • 規范等級 A
      320. 禁止非圖集貼圖資源不合理的留白. 會影響 UGUI 運行時自動合批.
      321. 資源設置 UI 的貼圖資源禁止勾選 Generate Mip Maps.
      322. 禁止使用修改 Alpha 值的方式來隱藏界面.
      323. 盡可能降低 Release 版中圖集留白, 提高貼圖利用率.
      324. 盡可能將圖集中大的圖片改為底圖加載.

    • 規范等級 B
      340. 建議同一 Canvas 中使用到的圖集數量控制在三個以內.

    • 規范等級 C
      360. 建立合理規划公共圖集. 在內存占用/加載頻度/引用復雜度之間確定合理的平衡點.

  4. 渲染

    • 規范等級 S
      400. 禁止匿名 GrabPass. 如需使用到 GrabPass 必須命名並盡可能復用.

    • 規范等級 A
      420. Shader中盡可能減少多 Pass 渲染, 除非必須這么做.
      421. 盡可能降低 Release 版中 Shader 中的 Keyword 數量.
      422. 盡可能降低 SkinnedMeshRenderer 組件數量.

    • 規范等級 B
      440. 禁止逐幀直接使用名稱對 Shader Uniform 量進行更新.
      441. 盡量避免在 Shader 中使用復雜的計算如: pow/sin/cos/tan/log 等.
      442. 建議在 Shader 中采用預混合或實時混合紋理的方式代替實時地多次紋理采樣.
      443. 移動平台的 Shader 編碼一定要考慮數據精度(float/half/fixed)的合理使用.
      444. 應盡可能減少每幀 Material.GetXX/Material.SetXX的次數, 比如把多個 uniform half 變量合並為 uniform half4.

  5. 動畫

    • 規范等級 B
      540. 盡可能避免將 Animator 的 Culling Mode 屬性設置為 Always, 對於不使用 RootMotion 的項目建議選擇 CullCompletely.
  6. 物理

    • 規范等級 B
      640. 盡可能避免使用物理引擎. 建議自行編碼模擬物理效果.
      641. 使用物理模塊的游戲, 建議在 PhysicsManager 中設置矩陣, 會有較大的性能提升.
  7. 音頻

    • 規范等級 A
      720. 如使用第三方音頻插件, 需禁用 FMOD 模塊(Edit -> Project Settings -> Audio -> Disable -> UnityAudio).

    • 規范等級 B
      740. 若不需要立體音效, 音頻導入設置需勾選 Force to Mono(注: 制作音頻時就應該制作單通道的.)

  8. 資源

    • 規范等級 A
      820. 音頻格式: iOS平台一般使用 mp3, Android平台一般使用 ogg.
      821. 無需由邏輯代碼訪問的渲染資源禁止勾選 Read/Write Enabled, 如網格和圖片.
      822. 導入蒙皮網格模型時建議勾選 Optimize GameObject 優化選項, 可極大地降低骨骼層次復雜度, 優化 CPU 性能.
      823. 無動作模型資源必須將 Animation Type 設置為 None, 否則會導致游戲對象掛在不必要的動畫腳本, 大量的話會嚴重影響 CPU 性能.
      824. 導入的模型如果無需用到法線和切線, 必須將導入設置的 Normals 和 Tangents 選項設置為 None.
      825. 導入的模型如果無需參與Unity Lightmap 烘焙, 必須將導入設置的 Generate Lightmap UVs 選項設置為 None.
  9. 發包

    • 規范等級 S
      900. 禁止在 Release 版中存在任何 OnGUI 相關代碼.
      901. 禁止在 Release 版中存在任何日常調試相關的 UnityEngine.DeBug 類日志輸出.
      902. 禁止在 Release 版中開啟 "Development Build" 和 "Script Debugging" 選項.
      903. 在發布時必須將游戲鎖定至合適的幀率(建議 30/60 幀)

    • 規范等級 A
      921. 禁止在 Release 版中使用引擎提供的 SendMessage 方法.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM