開發適用於所有螢幕的遊戲

開發 Android 遊戲時,請務必預期會出現各種可能的玩家體驗,並持續根據玩家的即時互動需求進行調整。只要支援不同的玩家體驗,就能讓遊戲過程更有彈性,藉此擴大遊戲的觸及範圍。

不同的玩家體驗之間可能有下列差異:

  • 裝置板型規格:雖然手機提供傳統的 Android 裝置體驗,但玩家還是可能透過其他板型規格與遊戲互動。 ChromeOS 裝置可以執行顯示遊戲的 Android 容器。搭載 Android 的平板電腦支援多種不同等級的擬真度。Android TV 裝置支援更豐富的細節和更身歷其境的體驗。玩家可以使用顯示擴充功能工具來模擬多視窗模式環境。如果玩家使用折疊式裝置,則可以在遊戲工作階段期間變更螢幕大小。
  • 互動方法:玩家只要輕觸裝置螢幕就能輸入內容,但也可以改為使用滑鼠、觸控板、鍵盤或控制器。此外,顯示擴充功能工具和折疊式裝置也能讓玩家在更大的螢幕上體驗遊戲,以使較長的遊戲工作階段和更為複雜的介面能夠運作。
  • 硬體支援:有些搭載 Android 的裝置沒有常見的手持裝置硬體,例如後置鏡頭、GPS 和網路連線。遊戲應配合可用硬體,並妥善因應缺少部分功能的情形。

本指南針對不同類型的螢幕和使用者互動模式,提供相關的遊戲開發最佳做法。本指南也針對遊戲設計和有效測試策略的擬定提供相關建議。

遊戲設計最佳做法

規劃遊戲的設計和架構時,請遵循下列各節所述的最佳做法。

手動回應設定變更

當 Android 系統偵測到設定變更 (例如螢幕大小、螢幕方向或輸入方式變更) 時,系統預設會重新啟動目前的活動。如要保留應用程式或遊戲中的狀態,系統預設會先呼叫 onSaveInstanceState() 再重新啟動活動,並在啟動後呼叫 onRestoreInstanceState()。不過,活動必須重新載入所有相關聯的服務和資源,系統才能執行這項程序。如要進一步瞭解這項預設行為,請參閱設定變更處理指南

一般的遊戲工作階段會經歷幾項設定變更。如果遊戲允許系統處理每項設定變更,遊戲場景就會一再損毀並重新啟動,因而降低遊戲效能。因此,我們強烈建議你自行處理遊戲中的設定變更。

如要瞭解如何將這項設定變更邏輯新增至遊戲中,請參閱這一節,瞭解如何建立自訂設定變更處理常式。

建立彈性架構

如要讓遊戲支援更多裝置,請按照下列最佳做法進行:

  • 部署 Android App Bundle,而非個別 APK。Android App Bundle 可讓你將不同解析度和不同架構模型 (例如 x86、ARM) 的構件封裝成單一構件。更棒的是,Android App Bundle 支援更高的遊戲大小上限。每個基礎 APK 最大可達 150 MB,套裝組合本身的大小則可達數 GB。
  • 新增 x86 架構支援。這個步驟能改善遊戲在不支援 ARM 的裝置上的效能,因為這類裝置現在可以直接執行操作說明,不需要先轉譯。

新增 Vulkan 支援

如果遊戲支援 Vulkan,就能提高圖形顯示效能。大多數的裝置都支援這個圖形顯示 API。

建立自訂設定變更處理常式

如要宣告遊戲自行處理的設定變更類型,請將每個 <activity> 元素的 android:configChanges 屬性加入代表特定螢幕或複雜介面的資訊清單。

以下程式碼片段說明,如何宣告遊戲會處理螢幕大小、螢幕方向和輸入方式變更:

<activity ...
    android:configChanges="screenSize|orientation|keyboard|keyboardHidden">
</activity>

現在當宣告的設定發生變更時,系統會叫用不同的方法,也就是 onConfigurationChanged()。 你可在這個方法中新增邏輯,以更新遊戲 UI:

處理螢幕設定變更

每次在 android:configChanges 屬性中分別加入 screenSizeorientation 值時,遊戲都會手動處理螢幕大小和螢幕方向變更。你可以使用這些新值來更新場景的內容和玩家輸入區域。如要瞭解如何設計遊戲的版面配置,讓遊戲更容易更新,請參閱不同螢幕大小的支援指南

在遊戲導入的 onConfigurationChanged() 中,請使用傳入的 Configuration 物件和視窗管理工具的 Display 物件,分別判斷更新後的螢幕大小值和螢幕方向值。

以下程式碼片段說明如何取得更新後的遊戲螢幕大小和方向:

Kotlin

override fun onConfigurationChanged(newConfig: Configuration) {
    super.onConfigurationChanged(newConfig)
    val density: Float = resources.displayMetrics.density
    val newScreenWidthPixels = (newConfig.screenWidthDp * density).toInt()
    val newScreenHeightPixels = (newConfig.screenHeightDp * density).toInt()

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    val newScreenOrientation: Int = newConfig.orientation

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    val newScreenRotation: Int = windowManager.defaultDisplay.rotation
}

Java

@Override
public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    float density = getResources().getDisplayMetrics().density;
    int newScreenWidthPixels = (int) (newConfig.screenWidthDp * density);
    int newScreenHeightPixels = (int) (newConfig.screenHeightDp * density);

    // Get general orientation; either Configuration.ORIENTATION_PORTRAIT or
    // Configuration.ORIENTATION_LANDSCAPE.
    int newScreenOrientation = newConfig.orientation;

    // Get general rotation; one of: ROTATION_0, ROTATION_90, ROTATION_180,
    // or ROTATION_270.
    int newScreenRotation = getWindowManager().getDefaultDisplay()
            .getRotation();
}

請注意,即使應用程式以全螢幕模式執行,只要改變折疊式裝置的折疊狀態,也會同時變更設定。 因此,如果使用者在遊戲執行期間摺疊或展開裝置,應用程式可能必須處理螢幕大小或像素密度的變更。

個別遊戲的螢幕品質

以下各節說明如何根據遊戲品質,來調整遊戲適應螢幕大小或螢幕方向變更的方式:

全螢幕模式

在 ChromeOS 等部分平台上,Android 應用程式和遊戲預設可使用視窗模式及調整大小。如果遊戲應一律以全螢幕模式執行,你可以將其中一個 <activity> 元素中的 android:resizeableActivity 屬性設為 false,如下列程式碼片段所示:

<activity ...
    android:resizeableActivity="false">
</activity>

此外,你也可以將 android:resizeableActivity 屬性設為 false,以免發生與大小相關的設定變更。不過,除非遊戲一律會以全螢幕模式執行,否則建議你只將這個屬性新增為測試用的暫時修正方式。

螢幕方向

如果遊戲要求裝置感應器必須維持在特定方向,請在遊戲活動中指定 android:screenOrientation 的值,如下列程式碼片段所示。這項設定有助於避免遊戲中的場景意外上下翻轉。

<activity ...
    android:screenOrientation="landscape">
</activity>

個別裝置的螢幕品質

以下各節說明當某些裝置具備特定特質時,如何處理與螢幕相關的設定變更。

顯示比例

部分裝置支援不同的顯示比例。舉例來說,折疊式裝置在折疊狀態下支援 21:9 的顯示比例。如要處理各種不同的顯示比例,請至少採取下列其中一種做法:

  • 指定 Android 8.0 (API 級別 26) 以上版本。
  • 打造可調整大小的遊戲場景和介面。在搭載 Android 7.0 (API 級別 24) 以上版本的裝置上,將 android:resizeableActivity 設為 true
  • 宣告支援的顯示比例上限。在與遊戲相關聯的 <meta-data> 屬性中,將 android.max_aspect 設為 2.4,如下列程式碼片段所示。但請注意,如果顯示比例大於你指定的值,遊戲在顯示畫面中會出現上下黑邊

    <application>
    <meta-data android:name="android.max_aspect"
               android:value="2.4" />
    </application>
    

同時顯示多項活動

許多現代裝置都支援多種螢幕版面配置,包括分割畫面、子母畫面和大型顯示區域。使用其中一種版面配置時,系統可以同時顯示多項活動。

在搭載 Android 9 (API 級別 28) 以上版本的裝置中,所有熱門可見活動可能會同時顯示。不過,如要讓這個行為順利運作,遊戲和裝置的原始設備製造商 (OEM) 都必須選擇啟用這項功能。你可以在遊戲資訊清單中將 android.allow_multiple_resumed_activities 設為 true,藉此在遊戲中新增這項功能,如下列程式碼片段所示:

<application>
    <meta-data android:name="android.allow_multiple_resumed_activities"
               android:value="true" />
</application>

接著,你可以使用不同的裝置測試遊戲,看看哪些裝置提供正常執行多視窗運作時所需的原始設備製造商 (OEM) 支援。

如要進一步瞭解如何將遊戲顯示畫面設為多視窗模式,請參閱多視窗模式功能支援指南

處理不同的互動模式類型

只要在 android:configChanges 屬性中分別加入 keyboardkeyboardHidden 的值,遊戲就會手動處理鍵盤狀態和鍵盤可用性。你可以使用這些新值來更新遊戲的主要輸入方式。

設定遊戲來支援多種使用者輸入內容時,請注意下列事項:

  • 偵測輸入方式,而非個別裝置。這樣就能更輕鬆地改善玩家體驗,而不必將重心放在玩家可能擁有的特定裝置上。
  • 在手動處理的設定變更清單中加入 keyboardHidden 屬性。這樣一來,遊戲就能追蹤實體鍵盤連到裝置但無法使用的情形。
  • 確定目前可用的輸入方式。方法很簡單,只要在遊戲啟動時和每次變更設定後,呼叫 getInputDeviceIds() 即可。

    你通常可以根據玩家偏好的輸入裝置,判斷他們打算如何與遊戲互動:

    • 玩家通常會使用鍵盤或遊戲控制器來執行快速按鈕序列。
    • 玩家通常會使用觸控螢幕或觸控板來執行更複雜的手勢。
    • 玩家通常會使用滑鼠來執行較高精確度的輸入動作。

下列各節說明特定輸入裝置類型的最佳做法。

鍵盤

建立遊戲的鍵盤配置時,請考量玩家在特定場景中的瀏覽方式,以及他們與遊戲設定的互動方式。

WASD 鍵或方向鍵通常最適合用於控制角色移動方向。 針對可控制角色能在遊戲中進行的各項重要動作或技能,建議你指定專屬控制鍵。如要盡可能改善玩家體驗,請考慮在遊戲中新增自訂鍵繫結功能。

玩家也應該要能開啟遊戲選單,並使用鍵盤瀏覽選單。Esc 鍵是暫停場景及顯示遊戲選單的常用對應鍵。

如要進一步瞭解如何支援遊戲中的鍵盤輸入功能,請參閱鍵盤瀏覽功能支援指南以及鍵盤動作處理指南

遊戲控制器

如要進一步瞭解如何處理遊戲中的控制器輸入,請參閱遊戲控制器支援指南

滑鼠或觸控板

請注意,如果遊戲可讓玩家使用滑鼠或觸控板來輸入,表示玩家除了玩遊戲以外,也會與裝置進行其他互動。請務必注意,若要求擷取指標,所有滑鼠輸入都會導向你的遊戲。因此,在遊戲取得所需資訊後,你就可以停止指標擷取程序,允許玩家再度使用裝置的標準滑鼠控制功能。

在搭載 Android 8.0 (API 級別 26) 以上版本的裝置中,你可以使用 Mouse Capture API 協助執行指標擷取程序。如果遊戲會回應高精確度的輸入內容,你可以呼叫 getX()getY() 方法,以取得指標目前的座標。

如要進一步瞭解如何支援遊戲中的滑鼠輸入和觸控板輸入功能,請參閱觸控和指標動作追蹤指南以及多點觸控手勢處理指南

測試遊戲

在發布遊戲之前,請先完成下列各節中的步驟,測試遊戲要如何回應設定變更。

更新測試計畫

驗證遊戲功能時,請採用下列測試案例:

  • 將遊戲視窗最小化及最大化 (如果遊戲一律採用全螢幕模式,則不適用此步驟)。
  • 變更螢幕大小。
  • 變更螢幕方向 (如果遊戲有固定的方向,則不適用此步驟)。
  • 連接及取消連接輸入裝置,例如鍵盤和滑鼠。
  • 如果遊戲支援多視窗運作模式,請執行這種模式。

你也可以考慮更新遊戲的品質驗證系統,以便改善更多類型的玩家體驗。

如要瞭解測試遊戲的最佳做法,請參閱《測試基礎知識》指南

使用測試和偵錯工具

你可以使用平台支援的多種工具來執行測試: