支援大螢幕大小調整功能

從手機擴充到不同的大螢幕板型規格,遊戲處理視窗管理方式時需考量的事項。在 ChromeOSGoogle Play 遊戲電腦版上,遊戲可以透過主桌面介面以視窗模式執行。搭載 Android 12L (API 級別 32) 以上版本,且螢幕寬度為 > 的新 Android 平板電腦和摺疊式裝置分割畫面模式中,遊戲可在分割畫面模式中並排執行、調整其他應用程式的大小,甚至還能在摺疊式裝置的內外螢幕之間移動,進而導致視窗大小及某些裝置方向的設定變更。

使用 Unity 遊戲調整大小

基本的大螢幕設定

宣告遊戲是否能處理大小調整問題:

<android:resizeableActivity="true" or "false" />

如果無法支援調整大小,請確保遊戲資訊清單明確定義支援的最小和最大顯示比例:

<!-- Render full screen between 3:2 and 21:9 aspect ratio -->
<!-- Let the platform letterbox otherwise -->
<activity android:minAspectRatio="1.5">
<activity android:maxAspectRatio="2.33">

Google Play 遊戲電腦版

對於 Google Play 遊戲電腦版,平台會處理視窗大小調整作業,並遵守指定的顯示比例。視窗大小會自動鎖定為最佳尺寸。如果主要螢幕方向為橫向,或者遊戲採用直向模式,您至少須支援 16:9 的顯示比例。如要獲得最佳體驗,請為橫向遊戲明確支援 21:9、16:10 和 3:2 的顯示比例。此處不必調整視窗大小,但仍建議與其他板型規格相容。

如需詳細資訊和最佳做法,請參閱「設定 Google Play 遊戲電腦版的圖像」。

ChromeOS 和 Android 大螢幕

如要在 ChromeOS 和大螢幕 Android 裝置上將遊戲的可視區域最大化,支援全螢幕沉浸模式,並藉由設定 decorView 標記、系統 UI 顯示設定或 WindowInsetsCompat API 隱藏系統資訊列。建議您妥善處理旋轉和調整設定事件大小,或避免在 ChromeOS 裝置上發生這些事件。

請注意,在大螢幕 Android 裝置上,遊戲可能會以您可能尚無法處理的設定執行。如果遊戲不支援所有視窗大小和方向設定,平台會在相容模式下為遊戲加上黑邊,並視需要顯示提示,再變更遊戲不支援的設定。

圖 1. 設定相容性對話方塊。

在某些裝置上,當玩家改用不支援的設定時,系統可能會提示玩家選擇重新載入遊戲,並根據新的視窗版面配置重新建立活動,從而中斷遊戲體驗。以各種多視窗模式設定 (2/3、1/2、1/3 視窗大小) 測試您的遊戲,並確認沒有遭到截斷或無法存取的遊戲元素或 UI 元素。此外,在折疊式裝置的內外螢幕切換時,測試遊戲如何回應折疊式裝置的連續性。如果遇到問題,請明確處理這些設定事件,並加入進階大螢幕大小調整支援功能。

進階大螢幕大小調整功能

圖 2. 桌面型態與摺疊式裝置的不同 UI。

如要退出相容性模式並避免活動重建,請按照下列步驟操作:

  1. 將主要活動宣告為可調整大小:

    <android:resizeableActivity="true" />
    
  2. 宣告明確支援「orientation」、「screenSize」、「smallestScreenSize」、「screenLayout」和「密度」在遊戲資訊清單 <activity> 元素的 android:configChanges 屬性中,接收所有大螢幕設定事件

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. 覆寫 onConfigurationChanged() 並處理設定事件,包括目前的螢幕方向、視窗大小、寬度和高度:

    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()
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       val newScreenOrientation: Int = newConfig.orientation
    
       // 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);
    
       // Configuration.ORIENTATION_PORTRAIT or ORIENTATION_LANDSCAPE
       int newScreenOrientation = newConfig.orientation;
    
       // ROTATION_0, ROTATION_90, ROTATION_180, or ROTATION_270
       int newScreenRotation = getWindowManager().getDefaultDisplay()
               .getRotation();
    }
    

您也可以查詢 WindowManager,查看目前的裝置旋轉情形。運用這項中繼資料檢查新視窗尺寸,並算繪成整個視窗大小。由於顯示比例差異,這可能不適用於所有情況,因此,您也可以將遊戲 UI 錨定在新視窗大小,並加上黑邊,核心遊戲內容。如果技術或設計限制妨礙上述任一方法,請在引擎中自行加上黑邊以維持長寬比,並在宣告 resizeableActivity = false 並避免設定模式時,盡可能縮放至最合適的尺寸。

無論您採用何種方法,請在各種設定 (折疊和展開、不同的旋轉變更、分割畫面模式) 中測試遊戲,並確認遊戲內 UI 元素沒有遭到截斷或重疊、觸控目標無障礙功能的問題,或顯示比例問題,導致遊戲畫面拉長、擠壓或變形。

此外,螢幕越大,像素越大,像素越大,區域越大。這可能會導致縮小的轉譯緩衝區或解析度較低的資產像素化。請在大螢幕裝置上使用最高品質的資產,並建立遊戲效能設定檔,確保沒有任何問題。如果遊戲支援多種品質等級,請確保遊戲適用於大螢幕裝置。

多視窗模式

多視窗模式可讓多個應用程式同時分享同一個畫面。多視窗模式不會改變活動生命週期;不過,在不同版本的 Android 上,多個視窗中應用程式的重新啟用狀態會有所不同 (請參閱「支援多視窗模式」中的「多視窗模式的活動生命週期」)。

當玩家將應用程式或遊戲設為多視窗模式時,系統會根據「進階大螢幕大小調整功能」一節中指定的設定變更活動通知活動。此外,當玩家調整遊戲大小或讓遊戲進入全螢幕模式,也會發生設定變更。

應用程式進入多視窗模式時,不保證會重新取得焦點。因此,如果您使用任何應用程式狀態事件暫停遊戲,請勿使用獲取焦點事件 (onWindowFocusChanged() 並將焦點值設為 true) 繼續執行遊戲。請改用其他事件處理常式或狀態變更處理常式,例如 onConfigurationChanged()onResume()。請注意,您隨時可以使用 isInMultiWindowMode() 方法,偵測目前的活動是否在多視窗模式下執行。

使用 ChromeOS 的多視窗模式,初始視窗尺寸是相當重要的考量因素。遊戲不需要全螢幕,而您必須宣告此情況的視窗大小。以下提供兩種建議做法。

第一個選項是在 Android 資訊清單的 <layout> 標記上使用特定屬性。defaultHeightdefaultWidth 屬性可控制初始尺寸。請留意 minHeightminWidth 屬性,避免玩家將遊戲視窗調整成您不支援的維度。最後,gravity 屬性會決定視窗啟動時,畫面上的顯示位置。以下是使用這些屬性的版面配置標記範例:

<layout android:defaultHeight="500dp"
        android:defaultWidth="600dp"
        android:gravity="top|end"
        android:minHeight="450dp"
        android:minWidth="300dp" />

設定視窗大小的第二個選項是透過動態啟動邊界進行。您可以使用 setLaunchBounds(Rect)⁠⁠ 定義起始視窗維度。如果指定空白矩形,活動會以最大化狀態啟動。

此外,如果您使用 Unity 或 Unreal 遊戲引擎,請務必使用最新版本 (Unity 2019.4.40 和 Unreal 5.3 以上版本),能夠提供良好的多視窗模式支援。

支援摺疊式裝置型態

使用 Jetpack WindowManager 版面配置程式庫支援摺疊式裝置型態 (例如桌面模式),提升玩家的沉浸式體驗和參與度:

圖 3. 遊戲採用免手持模式,並以主要檢視畫面顯示螢幕垂直,水平模式會顯示控制項。

Kotlin

fun isTableTopPosture(foldFeature : FoldingFeature?) : Boolean {
    contract { returns(true) implies (foldFeature != null) }
    return foldFeature?.state == FoldingFeature.State.HALF_OPENED &&
            foldFeature.orientation == FoldingFeature.Orientation.HORIZONTAL
}

Java

boolean isTableTopPosture(FoldingFeature foldFeature) {
    return (foldFeature != null) &&
           (foldFeature.getState() == FoldingFeature.State.HALF_OPENED) &&
           (foldFeature.getOrientation() == FoldingFeature.Orientation.HORIZONTAL);
}