2025 推薦給小型團隊用的 Unity 程式架構

Jerry ChanJerry Chan
1 min read

架構目標

  • 以「好理解、方便維護、可擴充性」為首要目標,效能問題可以遇到再說 (不要過早最佳化)

  • 適合 1~5 人團隊 單機遊戲

    • 全員進 Unity 做事,編輯 GameObject、ScriptableObject

解耦

  1. 組合設計:Composition > Inheritance, 把功能切成小 Component 來組裝,取代肥大的 Super Class

    1. Interface:用不到不需要硬寫 (專案還不夠大、Dependency 不夠複雜時,可以先忽略)

      1. 可以透過 GetComponent 拿到,配合 OdinInspector ShowInInspector 即可顯示

      2. 使用情境:當 dependency 的來源為外部系統 (ex: 第三方插件、平台移植…

      3. 處理 Life Cycle, Editor Processing…etc

    2. 盡量少用 Serialized Class, Pure Class… Refactor 重命名會很痛苦 (容易遺失原本的Serialize Field)

      1. 特例:你的製作流程完全不用 SerializeField (ex: 內容、關卡編輯在Unity外部,那你大概只需要把 Unity 當作 Builder)
  2. 事件解耦:UnityAction, UnityEvent,但不要濫用,有機會再詳細寫

  3. 進階:Reflection Field / Property, Property Bags

    1. ex: 在 Inpector 綁定資料的某個特定欄位

依賴注入

  1. Drag Reference (Inspector 拖曳物件):Unity 最基本也最直接的依賴注入

  2. Singleton:方便好用,「單機遊戲」下,大多數情境不會有問題

     //請你的GPT補完
     public abstract class SingletonBehaviour<T> : MonoBehaviour where T : MonoBehaviour
    
  3. GetComponentInParent : 從 Hierarchy 上拿 Dependency,沒有真的遇到 GameObject 數量多到導致的效能瓶頸前,稍微肥大的 GameObject Tree 不會怎麼樣

  4. Auto Attribute:自動 GetComponent, 包含在 MonoFSM,以後詳談

[AutoParent] ValueBinder _binder;

共用實作

  1. 用 Abstract Class 繼承 (配合Generic)

  2. Utility Static Class

  3. 避免到處隨意存取 Unity API, 包一層集中管理 (ex: player.transform.position = …

  4. Prefab Variant / Nested Prefab

Pattern

  1. State Machine Pattern:

    1. ex: Photon Fusion 2 FSM
  2. Polling (Update時狂問) 大部分情況不會造成問題,老話一句沒有遇到效能瓶頸,就沒有關係

工具

  1. Code 編輯器:JetBrains Rider

    1. AI Tool Plugin: Github Copilot Agent Mode
  2. Unity Asset

    1. Async 處理: UniTask

    2. 介面工具:Odin Inspector

0
Subscribe to my newsletter

Read articles from Jerry Chan directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

Jerry Chan
Jerry Chan