Supporta il ridimensionamento di schermi di grandi dimensioni

L'espansione dai telefoni a fattori di forma diversi per schermi di grandi dimensioni introduce alcune considerazioni su come il tuo gioco gestisce la gestione delle finestre. Su ChromeOS e Google Play Giochi su PC, il gioco può essere eseguito in modalità a finestre su un'interfaccia desktop principale. Sui nuovi tablet e pieghevoli Android con Android 12L (livello API 32) o versioni successive con larghezza dello schermo superiore a 600 dp, il gioco può essere eseguito affiancato in modalità schermo diviso con altre applicazioni, ridimensionato e persino spostato tra il display interno ed esterno dei dispositivi pieghevoli, determinando una modifica della configurazione per le dimensioni della finestra e, su alcuni dispositivi, l'orientamento.

Ridimensionabilità con i giochi Unity

Configurazione di base dello schermo grande

Dichiara se il tuo gioco è in grado di gestire la ridimensionabilità:

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

Se non è possibile supportare la ridimensionabilità, assicurati che il file manifest del gioco definisca esplicitamente le proporzioni minime e massime supportate:

<!-- 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 Giochi su PC

Per Google Play Giochi su PC, la piattaforma gestisce la ridimensionabilità delle finestre rispettando le proporzioni specificate. Le dimensioni della finestra sono bloccate automaticamente alle dimensioni ottimali. Devi supportare almeno proporzioni 16:9 se l'orientamento principale è orizzontale e 9:16 se il gioco è in modalità verticale. Per un'esperienza ottimale, supporta esplicitamente le proporzioni 21:9, 16:10 e 3:2 per un gioco orizzontale. La ridimensionabilità della finestra non è obbligatoria qui, ma è comunque buona per la compatibilità con altri fattori di forma.

Per ulteriori informazioni e best practice, visita la pagina Configurare la grafica per Google Play Giochi su PC.

Schermi grandi di ChromeOS e Android

Per massimizzare l'area di visualizzazione del tuo gioco a schermo intero su ChromeOS e sui dispositivi Android con schermo grande, supporta la modalità immersiva a schermo intero e nascondi le barre di sistema impostando i flag su decorView, sulla visibilità dell'interfaccia utente di sistema o tramite l'API WindowInsetsCompat. Dovrai inoltre gestire agevolmente la rotazione e il ridimensionamento degli eventi di configurazione o impedire che si verifichino sui dispositivi ChromeOS.

Tieni presente che sui dispositivi Android con schermi grandi, il gioco può essere eseguito in configurazioni che potresti non gestire già. Se il tuo gioco non supporta tutte le configurazioni di dimensioni e orientamento della finestra, il gioco viene adattato in modalità di compatibilità e, se necessario, chiede al player di passare a una configurazione non supportata.

Figura 1. Finestra di dialogo Compatibilità della configurazione.

Su alcuni dispositivi, quando un giocatore passa a una configurazione non supportata, potrebbe ricevere un'opzione per ricaricare il gioco e ricreare l'attività in base al layout della nuova finestra, interrompendo l'esperienza di gioco. Testa il tuo gioco in varie configurazioni della modalità multi-finestra (2/3, 1/2, 1/3 della finestra) e verifica che nessun elemento di gioco o UI venga tagliato o inaccessibile. Inoltre, verifica come il gioco risponde alla continuità del dispositivo quando ti sposti tra lo schermo interno ed esterno dei dispositivi pieghevoli. Se riscontri problemi, gestisci esplicitamente questi eventi di configurazione e aggiungi il supporto avanzato per la ridimensionabilità di schermi di grandi dimensioni.

Ridimensionabilità avanzata di schermi di grandi dimensioni

Figura 2. UI diverse su computer e pieghevoli in posizione da tavolo.

Per uscire dalla modalità di compatibilità ed evitare la ricreazione dell'attività, procedi nel seguente modo:

  1. Dichiara la tua attività principale come ridimensionabile:

    <android:resizeableActivity="true" />
    
  2. Dichiara il supporto esplicito per "orientamento", "screenSize", "smallestScreenSize", "screenLayout" e "density" nell'attributo android:configChanges dell'elemento <activity> del manifest del tuo gioco per ricevere tutti gli eventi di configurazione su schermi di grandi dimensioni:

    <android:configChanges="screenSize | smallestScreenSize | screenLayout | orientation | keyboard |
                            keyboardHidden | density" />
    
  3. Esegui l'override di onConfigurationChanged() e gestisci l'evento di configurazione, inclusi orientamento, dimensioni della finestra, larghezza e altezza correnti:

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

Puoi anche eseguire una query sul WindowManager per controllare l'attuale rotazione dei dispositivi. Usando questi metadati, controlla le dimensioni della nuova finestra ed esegui il rendering alla dimensione intera della finestra. Questo potrebbe non funzionare in tutti i casi a causa delle differenze di proporzioni, quindi, in alternativa, collega l'UI del gioco alle nuove dimensioni della finestra e letterbox ai contenuti principali del gameplay. Se ci sono limitazioni tecniche o di progettazione che impediscono uno dei due approcci, crea il tuo letterbox nel motore per mantenere le proporzioni e adattarlo alle migliori dimensioni possibili dichiarando resizeableActivity = false ed evitando la modalità di configurazione.

Indipendentemente dall'approccio utilizzato, testa il gioco in varie configurazioni (piega e aperta, diverse modifiche di rotazione, modalità schermo diviso) e assicurati che non ci siano elementi UI in-game tagliati o sovrapposti, nonché problemi di accessibilità del touch-target o problemi di proporzioni che provochino allungamento, schiacciamento o distorsione del gioco.

Inoltre, schermi più grandi di solito significano pixel più grandi, perché hai lo stesso numero di pixel per un'area molto più ampia. Questo può causare la pixelizzazione per i buffer di rendering ridimensionati o per gli asset con risoluzione inferiore. Usa i tuoi asset di massima qualità su dispositivi con schermi di grandi dimensioni e profila il rendimento del tuo gioco per assicurarti che non ci siano problemi. Se il tuo gioco supporta più livelli qualitativi, assicurati che tenga conto dei dispositivi con schermi grandi.

Modalità multi-finestra

La modalità Multi-finestra consente a più app di condividere lo stesso schermo contemporaneamente. La modalità multi-finestra non modifica il ciclo di vita dell'attività; tuttavia, lo stato di ripresa delle app in più finestre varia a seconda delle versioni di Android (vedi Ciclo di vita dell'attività in modalità multi-finestra in Supporto Multi-finestra).

Quando il giocatore attiva la modalità multi-finestra per un'app o un gioco, il sistema notifica l'attività di una modifica alla configurazione, come specificato nella sezione Ridimensionabilità avanzata di schermi di grandi dimensioni. Una modifica alla configurazione si verifica anche quando il giocatore ridimensiona il gioco o lo reimposta alla modalità a schermo intero.

Non vi è alcuna garanzia che l'applicazione riacquisisca lo stato attivo quando viene attivata la modalità multi-finestra. Pertanto, se utilizzi uno qualsiasi degli eventi di stato dell'app per mettere in pausa il gioco, non fare affidamento sull'evento di acquisizione dello stato attivo (onWindowFocusChanged() con valore dello stato attivo impostato su true) per riprendere il gioco. Usa invece altri gestori di eventi o modifiche di stato come onConfigurationChanged() o onResume(). Tieni presente che puoi sempre utilizzare il metodo isInMultiWindowMode() per rilevare se l'attività corrente è in esecuzione in modalità multi-finestra.

Con la modalità multi-finestra su ChromeOS, le dimensioni iniziali della finestra diventano una considerazione importante. Un gioco non deve necessariamente essere a schermo intero: dovrai indicare le dimensioni della finestra corrispondente. Esistono due metodi consigliati per affrontare questa situazione.

La prima opzione funziona utilizzando attributi specifici nel tag <layout> del file manifest Android. Gli attributi defaultHeight e defaultWidth controllano le dimensioni iniziali. Tieni presente anche gli attributi minHeight e minWidth per impedire ai giocatori di ridimensionare la finestra di gioco in dimensioni non supportate. Infine, c'è l'attributo gravity, che determina dove viene visualizzata la finestra sullo schermo quando viene avviata. Di seguito è riportato un esempio di tag di layout in cui vengono utilizzati questi attributi:

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

La seconda opzione per impostare le dimensioni della finestra utilizza i limiti di avvio dinamici. Se utilizzi setLaunchBounds(Rect)⁠⁠, puoi definire le dimensioni della finestra iniziale. Se viene specificato un rettangolo vuoto, l'attività inizia in uno stato ingrandito.

Inoltre, se utilizzi i motori di gioco Unity o Unreal, assicurati di utilizzare una versione recente (Unity 2019.4.40 e Unreal 5.3 o versioni successive) che offra un buon supporto per la modalità multi-finestra.

Supporto pieghevole per postura

Utilizza la libreria di layout WindowManager di Jetpack per supportare posizioni pieghevoli, come quelle da tavolo, per aumentare il coinvolgimento e il coinvolgimento del giocatore:

Figura 3. Gioco in postura da tavolo con vista principale sulla parte verticale del display, controlli sulla parte orizzontale.

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