Unterstützung großer Bildschirmgrößen

Bei der Erweiterung von Smartphones auf verschiedene große Bildschirmformfaktoren sollten Sie berücksichtigen, wie Ihr Spiel die Fensterverwaltung handhaben kann. Unter ChromeOS und Google Play Spiele auf dem PC kann Ihr Spiel im Fenstermodus auf einer Hauptoberfläche ausgeführt werden. Auf neuen Android-Tablets und faltbaren Geräten mit Android 12L (API-Level 32) oder höher und einer Bildschirmbreite von mehr als 600 dp kann dein Spiel im Split-Screen-Modus mit anderen Apps nebeneinander ausgeführt werden. Außerdem kann die Größe angepasst und auf faltbaren Geräten sogar zwischen dem inneren und äußeren Display gewechselt werden, was zu einer Konfigurationsänderung der Fenstergröße und der Ausrichtung auf einigen Geräten führt.

Größenanpassung durch Unity-Spiele

Grundlegende Konfiguration für große Bildschirme

Geben Sie an, ob die Größe Ihres Spiels angepasst werden kann:

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

Wenn die Größenanpassung nicht unterstützt wird, achten Sie darauf, dass im Spielmanifest explizit die minimalen und maximalen unterstützten Seitenverhältnisse definiert sind:

<!-- 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 Spiele auf dem PC

Bei Google Play Spiele auf dem PC übernimmt die Plattform die Größenanpassung von Fenstern unter Berücksichtigung des angegebenen Seitenverhältnisses. Die Fenstergröße wird automatisch auf die optimalen Abmessungen festgelegt. Sie müssen mindestens ein Seitenverhältnis von 16:9 unterstützen, wenn Sie das Querformat verwenden, und ein Seitenverhältnis von 9:16, wenn Sie Spiele im Hochformat spielen. Für eine optimale Leistung sollten Sie bei Spielen im Querformat die Seitenverhältnisse 21:9, 16:10 und 3:2 explizit unterstützen. Die Größe des Fensters muss hier nicht veränderbar sein, ist aber für andere Formfaktoren immer noch gut.

Weitere Informationen und Best Practices finden Sie unter Grafiken für Google Play Spiele auf dem PC konfigurieren.

Große Bildschirme mit ChromeOS und Android

Wenn Sie den sichtbaren Bereich für Ihr Spiel im Vollbildmodus auf ChromeOS- und Android-Geräten mit großem Bildschirm maximieren möchten, sollten Sie den immersiven Vollbildmodus unterstützen und die Systemleisten ausblenden, indem Sie Flags auf decorView, die Sichtbarkeit der System-UI oder die WindowInsetsCompat API festlegen. Außerdem ist es wichtig, dass Sie Rotations- und Größenänderungsereignisse korrekt verarbeiten oder verhindern, dass sie auf ChromeOS-Geräten auftreten.

Auf Android-Geräten mit großen Bildschirmen kann Ihr Spiel in Konfigurationen laufen, die Sie möglicherweise noch nicht kennen. Wenn Ihr Spiel nicht alle Konfigurationen für Fenstergröße und -ausrichtung unterstützt, wird Ihr Spiel von der Plattform-Letterbox im Kompatibilitätsmodus angezeigt und der Spieler gegebenenfalls aufgefordert, zu einer nicht unterstützten Konfiguration zu wechseln.

Abbildung 1. Dialogfeld für Konfigurationskompatibilität.

Wenn ein Spieler zu einer nicht unterstützten Konfiguration wechselt, wird er auf einigen Geräten möglicherweise aufgefordert, das Spiel neu zu laden und die Aktivität so zu reproduzieren, dass sie am besten in das neue Fensterlayout passt. Dadurch wird das Spiel gestört. Testen Sie Ihr Spiel in verschiedenen Konfigurationen im Mehrfenstermodus (2/3, 1/2, 1/3 Fenstergröße) und achten Sie darauf, dass das Spiel nicht abgeschnitten wird oder Elemente der Benutzeroberfläche unzugänglich sind. Außerdem kannst du testen, wie dein Spiel auf faltbare Kontinuität reagiert, wenn bei faltbaren Geräten zwischen dem inneren und dem äußeren Display gewechselt wird. Wenn Probleme auftreten, bearbeiten Sie diese Konfigurationsereignisse explizit und fügen Sie erweiterte Unterstützung für die Größenanpassung großer Bildschirme hinzu.

Erweiterte Größenanpassung für große Bildschirme

Abbildung 2: Verschiedene UIs für Desktop-Computer und faltbares Tablet in der Position „Auf dem Tisch“

So beenden Sie den Kompatibilitätsmodus und vermeiden die Wiederherstellung von Aktivitäten:

  1. Geben Sie für Ihre Hauptaktivität an, dass die Größe angepasst werden kann:

    <android:resizeableActivity="true" />
    
  2. Deklarieren Sie im Attribut android:configChanges des <activity>-Elements Ihres Spielmanifests explizite Unterstützung für „orientation“, „screenSize“, „smallestScreenSize“, „screenLayout“ und „density“, um alle Konfigurationsereignisse für große Bildschirme zu empfangen:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. Überschreiben Sie onConfigurationChanged() und verarbeiten Sie das Konfigurationsereignis, einschließlich der aktuellen Ausrichtung, Fenstergröße, Breite und Höhe:

    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();
    }
    

Du kannst auch das WindowManager abfragen, um die aktuelle Gerätedrehung zu prüfen. Überprüfen Sie mithilfe dieser Metadaten die neuen Fensterabmessungen und rendern Sie sie in der gesamten Fenstergröße. Aufgrund von unterschiedlichen Seitenverhältnissen funktioniert dies möglicherweise nicht in allen Fällen. Verankern Sie daher alternativ Ihre Spiel-UI in der neuen Fenstergröße und im Letterbox-Format, die Ihre wichtigsten Spielinhalte enthalten. Wenn es technische oder gestalterische Einschränkungen gibt, die eines der beiden Ansätze verhindern, führen Sie ein eigenes Letterbox-Bild innerhalb der Suchmaschine durch, um das Seitenverhältnis beizubehalten, und skalieren Sie auf die bestmögliche Größe, geben Sie dabei resizeableActivity = false an und vermeiden Sie den Konfigurationsmodus.

Unabhängig von deinem Ansatz solltest du dein Spiel in verschiedenen Konfigurationen testen (Falten und Aufklappen, verschiedene Änderungen an der Drehung, Splitscreen-Modus). Achte dabei darauf, dass es keine Abstriche oder Überlappungen von In-Game-UI-Elementen, Probleme mit Touch-Ziel-Bedienungshilfen oder Probleme mit dem Seitenverhältnis gibt, die dazu führen, dass das Spiel gedehnt, zusammengedrückt oder anderweitig verzerrt wird.

Außerdem bedeuten größere Bildschirme in der Regel mehr Pixel, weil die Anzahl der Pixel bei einem viel größeren Bereich gleich groß ist. Dies kann bei verkleinerten Renderingpuffern oder Assets mit geringerer Auflösung zu Verpixeln führen. Verwenden Sie hochwertige Assets auf Geräten mit großen Bildschirmen und Leistungsprofil für Ihr Spiel, um Probleme zu vermeiden. Wenn Ihr Spiel mehrere Qualitätsstufen unterstützt, achten Sie darauf, dass es Geräte mit großen Bildschirmen unterstützt.

Mehrfenstermodus

Mit dem Mehrfenstermodus können mehrere Apps gleichzeitig denselben Bildschirm verwenden. Der Mehrfenstermodus ändert nicht den Aktivitätslebenszyklus. Der fortgesetzte Status von Apps in mehreren Fenstern unterscheidet sich jedoch je nach Android-Version. Weitere Informationen finden Sie unter Aktivitätslebenszyklus im Mehrfenstermodus in der Unterstützung für den Mehrfenstermodus.

Wenn der Spieler eine App oder ein Spiel in den Mehrfenstermodus versetzt, benachrichtigt das System die Aktivität über eine Konfigurationsänderung, wie im Abschnitt Erweiterte Größenanpassung für den großen Bildschirm beschrieben. Eine Konfigurationsänderung erfolgt auch, wenn der Spieler die Größe des Spiels ändert oder das Spiel wieder im Vollbildmodus abspielt.

Es gibt keine Garantie, dass die App wieder den Fokus erhält, wenn sie in den Mehrfenstermodus versetzt wird. Wenn Sie also eines der App-Statusereignisse verwenden, um Ihr Spiel zu pausieren, sollten Sie sich nicht auf das erhaltene Fokusereignis (onWindowFocusChanged() mit dem Fokuswert auf „wahr“) verlassen, um das Spiel fortzusetzen. Verwenden Sie stattdessen andere Event-Handler oder Handler für Statusänderungen wie onConfigurationChanged() oder onResume(). Sie können jederzeit mit der Methode isInMultiWindowMode() feststellen, ob die aktuelle Aktivität im Mehrfenstermodus ausgeführt wird.

Im Mehrfenstermodus unter ChromeOS spielen die Abmessungen des anfänglichen Fensters eine wichtige Rolle. Ein Spiel muss nicht im Vollbildmodus sein. Geben Sie in diesem Fall an, wie groß das Fenster sein soll. Dafür gibt es zwei empfohlene Vorgehensweisen.

Bei der ersten Option werden spezifische Attribute im <layout>-Tag in Ihrem Android-Manifest verwendet. Mit den Attributen defaultHeight und defaultWidth werden die anfänglichen Dimensionen gesteuert. Achten Sie auch auf die Attribute minHeight und minWidth, um zu verhindern, dass Ihre Spieler die Größe des Spielfensters an Abmessungen anpassen, die Sie nicht unterstützen. Zu guter Letzt gibt es noch das Attribut gravity, das bestimmt, an welcher Stelle auf dem Bildschirm das Fenster angezeigt wird, wenn es geöffnet wird. Hier ist ein Beispiel für ein Layout-Tag mit diesen Attributen:

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

Bei der zweiten Option zum Festlegen der Fenstergröße werden dynamische Startgrenzen verwendet. Mit setLaunchBounds(Rect)⁠⁠ können Sie die Abmessungen des Startfensters definieren. Wenn ein leeres Rechteck angegeben wird, wird die Aktivität in maximiertem Zustand gestartet.

Wenn Sie die Spiel-Engines Unity oder Unreal nutzen, achten Sie darauf, dass Sie eine aktuelle Version verwenden (Unity 2019.4.40 und Unreal 5.3 oder höher), die den Mehrfenstermodus gut unterstützt.

Faltbare Körperhaltung

Verwenden Sie die WindowManager-Layoutbibliothek von Jetpack, um faltbare Umgebungen wie „Auf dem Tisch“ zu unterstützen und die Immersion und die Interaktion der Spieler zu steigern:

Abbildung 3: Auf dem Tisch stehendes Spiel mit Hauptansicht im vertikalen Teil des Displays, Steuerelemente auf dem horizontalen Teil.

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);
}