開始使用 Unity 開發遊戲

本指南將概述常見的遊戲開發週期。閱讀本指南後,建議您一併當做參考資源。

使用 Unity 時,開發生命週期包含三個階段:

  • 規劃與設計
  • 開發及測試
  • 發布及維護

規劃與設計

在計畫和設計階段,您會決定要如何建構遊戲。您將決定如何解決開發行動裝置方面的挑戰,並決定開發過程中要使用的工具和程序。

取得所有團隊成員的意見

與藝術、工程、設計、音訊和生產團隊合作,找出並記錄實作工作。例如:

  • 藝術團隊可能會為角色和環境建立資產紋理和網格預算。
  • 工程可能會決定針對每個平台進行剖析的記憶體和效能查核點。
  • 設計可能會規劃帶來體驗的遊戲機制。
  • 音訊專家可能會審查 UI、2D 和 3D 空間音效之間的聲音連續性要求。
  • 實際工作環境可以傳達發布要求,並讓團隊有所協調,確保一切順利。

設計適合行動裝置

開發行動平台應用程式時請特別考量下列事項,例如:

  • 多種螢幕顯示比例
  • 耗電量
  • 熱力與處理器節流
  • 觸控輸入
  • 跨平台開發
  • 圖形 API (Vulkan 或 OpenGL ES)

如要進一步瞭解設計行動裝置專屬注意事項,請參閱 Unity 的 Android 開發作業Google Play 學習中心

開發及測試

在開發和測試階段,您會建構遊戲並執行測試與正式發布前的準備作業。您在 Google Play 進行部分有限的內部測試,以便符合發布要求。您會根據 Play Asset Delivery 和 Unity Addressables 系統,調整部署策略,並在 Unity 中整理資產。

以下各節將說明專為協助您進行 Android 開發的 Unity 工具和技術。

顯示

轉譯是指在螢幕上從 Unity 場景中繪製 3D 和 2D 資產的程序。雖然 Unity 引擎會處理轉譯作業,但請務必考量幾個 Android 平台的因素。

紋理

根據您的目標裝置,判斷是否需要最大的紋理大小。分析記憶體配置時,請查看變更目標紋理大小可能節省的費用。

影格時間

為避免 Android 裝置發生過熱情形,平均目標影格時間值應小於 21 毫秒。有時候 (例如載入或電影體驗短片等) 的影格時間可能會超過 21 毫秒,但您應該保持在 21 毫秒內的核心遊戲體驗門檻。

在行動平台上,如果未達到最低目標,強制 VSync 就會限制影格速率。舉例來說,在 60Hz 畫面更新時,如果未達到每秒 60 個影格數,遊戲就會縮減至 30 個影格速率;如果未達到 30,則會將限縮至 15。

許多 Android 裝置都配備了 60Hz 和 120Hz 的螢幕刷新率。設定目標較短的影格時間 (60 Hz 更新為 10 毫秒,120 Hz 目標 5 毫秒) 的優點,避免對過熱保護和電池耗盡的風險提高,進而達到更高的轉譯率。

如要在 Unity 中設定遊戲的特定影格速率,請使用 Application.targetFrameRate

如果應用程式顯示的下一個影格比螢幕刷新率需求長,Android Frame Pacing 程式庫可協助您流暢地轉譯應用程式。若為 Unity 2021 以上版本,啟用 Android 影格使用速度功能會將螢幕刷新率設為與目標影格速率最相符的畫面。這樣可確保遊戲不會在不必要的螢幕更新時,浪費電池電力。

如要啟用這個程式庫,請依序前往「Project Settings」 >「Player」,然後在「Settings for Android」下方,勾選「Optimized Frame Pacing」核取方塊。

顯示「Project Settings」>「Player Settings」>「Optimized Fame Pacing」的對話方塊
圖 1. Unity 2019.2 以上版本的「Player Settings」可找到「Optimized Frame Pacing」

Vulkan API

Vulkan 是跨平台的高效能 3D 圖形 API,相較於 OpenGL ES,這類 API 的負擔較低。Unity 可以透過兩種方式使用 Vulkan。

Auto Graphics API

您可以搭配 Vulkan 使用 Auto Graphics API,但這可能會根據安裝的 Unity 版本而有不同的行為。您可以依序前往「Project Settings」>「Player」>「Rendering」來選取這項設定。

選擇要使用的 Unity 版本時,請注意下列幾點:

  • Unity 2021.1 以下版本不支援搭配 Auto Graphics API 使用 Vulkan。Unity 嘗試使用 OpenGL ES 3.2。如果裝置不支援 OpenGL ES 3.2,Unity 會依序改回 OpenGL ES 3.1、3.0 或 2.0。
  • Unity 2021.2 以上版本會先使用 Vulkan。如果裝置不支援 Vulkan,Unity 會改回 OpenGL ES 3.2、3.1、3.0 或 2.0。
「Project Settings」>「Player Settings」>「Rendering」>「Auto Graphics API」
圖 2. Auto Graphics API 設定。

手動圖像 API

或者,您也可以停用 Auto Graphics API,藉此手動啟用 Vulkan。如果您使用的是 Unity 2021.1 或先前的版本,這是唯一使用 Vulkan 的方式。

如果 Vulkan 在這份清單中的順序比 OpenGL ES 高,Unity 會先嘗試使用 Vulkan。如果裝置不支援 Vulkan,Unity 會透過 OpenGL ES 執行。 請參閱「開始使用 Vulkan」,進一步瞭解 Android 上的 Vulkan,例如如何使用現代圖像 API 和最佳化遊戲效能。

「Project Settings」>「Player Settings」>「Rendering」>「Graphics API」
圖 3. 在 Auto Graphics API 停用時手動設定圖形 API。Vulkan 優先使用。Unity 會改回 OpenGL ES 3.0。

繪製呼叫

螢幕上顯示的所有內容都與一或多個繪製呼叫相關聯。在行動平台上,您應該最佳化並減少傳送至圖形處理器 (GPU) 的繪製呼叫次數。

建議您將吸引來電次數想像成與交通號誌的汽車類似。指示燈變成綠色後,在光線變化前可以通過特定數量的車輛。當指示燈變成黃色時,您已經達到理想的目標影格時間 (21 毫秒),而當指示燈變成紅色時,即達到 33 毫秒的影格時間限制。任何會影響下一個轉譯影格的過去情況,因此產生的影格速率低於目標 30fps。

如要進一步瞭解如何改善遊戲中的繪製呼叫效能,請參閱 Unity 支援的批次處理文章。

陰影

陰影投放繪製呼叫可能會耗用大量 GPU 資源,而且即使是簡單的環境也一樣。為降低陰影轉換原始呼叫的費用,請嘗試使用硬化而非柔光陰影。如果低階裝置的 GPU 成本仍過高,請考慮使用 blob 陰影,而非硬陰影。

紋理

如果是 Android 上的 RGB 和 RGBA 紋理,建議使用 ASTC 紋理壓縮格式。在 Unity 中,Android 應使用的最低紋理壓縮選項為 ETC2。您可以在「Unity 版本設定」下,從 ASTC 改回使用 ETC2 做為備份。

如需平台所支援格式的完整清單,請參閱 Unity 說明文件中的「手動:建議、預設和支援的紋理格式 (依平台區分)」。

使用者介面和長寬比

您可以使用 Unity 的裝置模擬器工具,直接在 Unity 編輯器中預覽各種裝置螢幕解析度、螢幕方向和顯示比例。您可以在遊戲檢視畫面和裝置模擬器檢視畫面之間切換。

請參閱「在 Unity 中使用裝置模擬器模擬遊戲」一文,瞭解這項工具預覽。

圖 4. 搭載 Trivial Kart 的裝置模擬器。

您可以在 GitHub 的 games-samples 存放區中找到 Trivial Kart 原始碼。

您可以在裝置模擬器檢視畫面中選取裝置選項,快速驗證 UI 畫布元素的版面配置和正確性:

「Project Settings」>「Player Settings」>「Optimized Frame Pacing」
圖 5. 裝置模擬器支援在編輯器中變更裝置,因此可讓您及早發現設計問題。
「Project Settings」>「Player Settings」>「Optimized Fame Pacing」
圖 6.下載裝置模擬器套件前,請先勾選「Enable Pre-release Packages」

如需更多 Unity 的 UI 最佳化技巧,請參閱下列 Unity 教學課程:最佳化 Unity UI

物理學

Nvidia PhysX 引擎已內建於 Unity 中。不過請注意,行動裝置上的預設設定可能消耗太多資源,因此請特別留意以下幾點:

  • 請考慮您的目標影格速率,並據此設定固定時間。 預設值為 0.02 毫秒或 50Hz。您可以將目標提高到 0.03 以上,達到 30fps 目標。
  • 請考慮簡化網格橋接器,並盡量減少圖層衝突矩陣,以便判斷特定圖層類型的遊戲物件之間如何互動。

如要瞭解手機遊戲的物理設定和最佳化做法,請參閱 Unity 的「最佳化手機遊戲電子書」。

設定檔

應用程式開發人員通常會忽略或忽略剖析作業,直到應用程式到達重大故障點為止。建議您為程序安排專屬剖析時間,並遵循下列最佳做法:

  • 確定在開發期間可以分配剖析時間的時機,而不是隨機分配分析時間。
  • 儲存設定檔快照,以便與 Unity 設定檔分析工具搭配使用。
  • 您可以在目標裝置上剖析遊戲,準確掌握遊戲在目前開發階段的效能。
  • 分析遊戲的不同部分。
  • 分析玩家的遊戲方式。(請勿僅在遊戲處於閒置狀態或暫停畫面上時剖析遊戲)。
  • 在遊戲執行一段時間後以持續模式進行剖析,協助您找出行動裝置發生時可能發生的節流問題。

您可以個別或搭配使用下列剖析工具。

  • Unity 分析器 Unity 分析器是完全整合的效能分析工具,可針對 Unity 編輯器中的程式碼執行,並連線至執行開發模式版本的獨立 Android 裝置。

  • Android GPU 檢查器:使用 Android GPU Inspector (AGI) 即可執行影格層級偵錯。AGI 也會分析系統服務,包括 GPU、CPU、記憶體、電池和 GPU 計數器。

如要進一步瞭解如何在 Unity 中剖析遊戲,請觀看「Unity 剖析簡介」影片,或參閱「剖析 Unity 遊戲的完整指南」(以上都是透過 Unity 製作的遊戲)。

記憶體管理

Android 程序會共用目標裝置上的可用記憶體。當目標測試裝置有充足的可用記憶體資源時,您應剖析記憶體用量。在遊戲的一致時間點執行記憶體測試,以便適當比較工作階段和記憶體使用趨勢。

使用以 C# 編寫的指令碼時,請留意字串、字串比較,以及字串相關物件的配置 (例如用於遊戲設定的 JSON 檔案)。這些物件會經常產生記憶體配置,並有助於分散作業。

針對字串操縱序列使用 StringBuilder 類別,而不要使用字串內串連 (例如 "this" + "is" + "a" + "bad" + "idea" 與 StringBuilder.Concat() 函式呼叫)。

如要進一步瞭解字串,請參閱 Unity 說明文件中的字串和文字

評估 TextAsset 和 JSON 文字資源與偏好的 ScriptableObject 類型。ScriptableObjects 可有效處理跨場景資料儲存空間,並允許修改編輯器時間。

如需使用替代用於行動裝置最佳化的預設 JSON 控制代碼的替代方案,請參閱 Hutch 的「網路遊戲的隱藏最佳化功能」一文。

使用 Memory Advice API 判斷執行階段的記憶體用量。API 提供高、正常和低記憶體用量的停燈指標。您可以訂閱指標來取得更新,或直接輪詢指標以目前狀態。收到紅色信號時,請考慮減少遊戲物件集區或快取。在即時作業期間,請在遊戲遙測中加入此情況,並在啟動後檢查效能指標。

如要深入瞭解 Android 裝置的記憶體結構,以及 Unity 如何搭配運作,請觀看「瞭解 Android 記憶體用量 (來自 2018 年 Google I/O 大會)」影片。影片會逐步說明記憶體問題類型,以及記憶體不足終止工俱生效的時間。

垃圾收集

代管記憶體環境中的垃圾收集作業會清除未使用的記憶體片段,以供應用程式回收使用。遵循垃圾收集最佳做法,避免不必要的記憶體資源配置。

例如,您可以建立遊戲物件集區,而非使用隨選配置 (GameObject.Instantiate)。針對大型集區,請考慮分配多個影格,以降低遊戲在入門級 Android 裝置上沒有回應的風險。

請參考下列程式碼片段,建立從 MonoBehaviour 開始時叫用的簡易協同程式:

// Option 1: Bad for memory management - causes allocation each iteration
IEnumerator UpdateEnemyTarget() {
  while (enabled) {
    yield return new WaitForSeconds(1.0f);
    // Some intermittent function check
  }
}

// Option 2: Better for memory management - allocation of yield instruction once, reused each iteration
private YieldInstruction waitForSecond = new WaitForSeconds(1.0f);
IEnumerator BetterUpdateEnemyTarget() {
  while (enabled) {
    yield return waitForSecond;
    // Some other intermittent function
  }
}

您可以編輯 MonoBehaviour 範本檔案,移除預設的 Start()Update() 虛設常式函式,這樣就不會在開發時意外留下空白函式。

如需 MonoBehaviour 事件的執行順序總覽,請參閱 Unity 說明文件中的「事件函式執行順序」。如要進一步瞭解記憶體管理,請參閱「Unity 中的記憶體管理」課程。

如需行動遊戲效能最佳化提示,請參閱「最佳化行動遊戲效能:來自 Unity 頂尖工程師的剖析、記憶體和程式碼架構相關提示」。

Prefab 池化

CPU 影格時間遽增,幾乎完全是由遊戲期間 Prefab 例項化所造成。進入遊戲過程之前,可以考慮對投影機、臨時敵人和視覺效果預先暖機物件集區,以減少或消除啟動 CPU 的尖峰。在場景載入或簡介序列時,您可以將其他最佳化項目分散到多個「初始化影格」上。

您可以在 Unity Asset Store 中找到許多與遊戲物件集區管理相關的第三方集區資產。另外,只要應用程式、服務詳情請參閱「Unity 物件集區簡介」。

資產提供

對於首次部署至 Google Play 的應用程式,系統會限制其大小。視遊戲的大小和性質而定,您可能需要部分或全部的遊戲資源 (角色模型、環境、UI 元素等),玩家才能獲得您想要的體驗。

您可以使用 Play Asset Delivery (PAD) 服務來管理遊戲在安裝期間、快速追蹤或隨選所需的資產。整合 Unity Asset Bundle 以支援 PAD,您可以使用此工具指定要提供的元素。

可定址

如果您準備及檢查 Addressables 命名系統,在執行階段設定動態資源 (例如偏好、紋理和音效檔案) 不再是相當複雜的作業。可位址資產會與內容的建構和載入方式分離,Addressables 系統會取代「Resources」資料夾和資產包,以簡化您在執行階段中參照資產及載入資產的方式。

如需範例,請參閱 GitHub 上的使用 Addressables 套件示範專案。如要進一步瞭解如何開發 Addressables,請參閱 Unity 網誌上的 Addressable Asset System

使用 Addressable 素材資源版面配置時,如果將過多或過多的資產合併成通用的組合,就有優缺點。如要進一步瞭解如何透過 Addressables 管理內容,請參閱「使用 Addressables 簡化內容管理」。

您可以設定獨立的試用版,並嘗試各種存取模式來熟悉 Addressables 系統。您還可以查看開放原始碼專案 BuildLayout Explorer for Unity 2019.3 以上版本,並檢查 Addressables 產生的 buildlayout.txt 報表。

Chop Chop (Unity Open Project) 的資產是以 Addressables 系統封裝,用於所有載入和卸載。如需設定 Addressables 套裝組合的結構和設定說明,請參閱「使用 Addressable 資產封裝內容 | 開放式專案 Devlog」一文。

在 Chop Chop 專案中,預設載入的唯一場景 (初始化情境) 設定為使用 AssetReferences,而非直接連結至專案中的資產 (場景、 Prefabs 等)。

您可以在 GitHub 找到 Unity Open Project: Chop Chop 的原始碼。雖然專案不再處於開發階段,但仍可使用 Git 存放區和說明文件。

第三方外掛程式

如果您使用的是第三方外掛程式 (例如 Unity Asset Store 中的外掛程式),請務必檢查資料夾,並從「Resources」資料夾移除不需要的素材資源。在建構過程中,Unity 會收集「Resources」資料夾中的所有資產,並將其封裝在可在執行階段存取的單一組合中。這可能會讓最終套件增加,而通常不需要。

如要快速找出所有資源資料夾,請在「Project」面板中搜尋「Resources」。接著,您可以選取每個選項,辨別其中包含的內容,以及遊戲是否必要。

圖 7.從 Unity Asset Store 下載的資料夾中可能會有多個「Resources」資料夾。清除這些指令,以免將其封裝至應用程式套件。

發布及維護

準備好推出手機遊戲時,請決定發布對象、如何進行 Alpha 和 Beta 測試,以及發布後如何監控及追蹤效能。

分析受限版本的意見回饋

您可以對限定的目標對象發布應用程式,執行大規模的 Beta 版測試,或讓遊戲全面開放使用。在限定版本中,您可以依據更廣泛的即時目標對象和裝置組合來調整應用程式效能。

舉例來說,您可以使用 Unity 的 Android Performance TunerUnity 適用的 Google Analytics (分析),取得應用程式效能和玩家趨勢的深入分析,以利開發團隊調整及推送更新。您也可以使用數據分析資料,規劃類似類型的續集或相關遊戲。

Alpha 版和 Beta 版測試

Google Play 管理中心設定應用程式設定檔後,您可以準備公開的 Alpha 和 Beta 測試版本,並將這些版本發行給少數目標對象,以進行正式發布前審查。建議您僅向少數目標對象推出應用程式,以便利用較大的裝置集區解決所有最終問題,並收集初始意見回饋,以便在正式發布全球版本前做出回應。

您的 Unity 版本是透過 Android App Bundle 發布。詳情請參閱「手動:將應用程式提交至 Google Play」一文,其中也會說明從 APK 檔案到 AAB 格式的變更。

監控及追蹤

在遊戲的 LiveOps 和發布階段,您可以使用 Android Vitals 針對開發和測試期間可能無法存取的裝置,追蹤效能問題。詳情請參閱「觸及率和裝置功能和 Android Vitals 新功能」影片。

大型開發團隊通常會擁有獨特的自訂遊戲遙測管道,可提供與裝置效能相關的指標。請記得利用 Android Performance Tuner (APT) 和對應的 Unity 外掛程式,以便取得與影格速率、圖形擬真度、載入時間和放棄載入相關的指標。請按照將 Android Performance Tuner 整合至 Unity 遊戲中的逐步指南操作。

遊戲的生命週期在上線後不會停止。監控、維護及回應效能和意見回饋至關重要,這對於滿足使用者滿意度、正面評論,以及讓遊戲在所有市場的最終採用率至關重要。