Sviluppa giochi per tutti gli schermi

Quando sviluppi un gioco per Android, è importante prevedere la varietà di possibili esperienze dei giocatori e rimanere adattabile alle esigenze di interazione in tempo reale di un giocatore. Supportando diverse esperienze di gioco, aumenti la flessibilità del gameplay, il che ti aiuta a espandere la portata del tuo gioco.

Le differenze specifiche nell'esperienza dei giocatori includono:

  • Fattori di forma del dispositivo:sebbene gli smartphone offrano l'esperienza tradizionale dei dispositivi Android, è possibile interagire con i giochi su altri fattori di forma. I dispositivi ChromeOS possono eseguire un container Android che mostra la partita. I tablet che possono eseguire Android supportano diversi livelli di fedeltà. I dispositivi Android TV supportano esperienze più dettagliate e coinvolgenti. I giocatori possono simulare un ambiente multi-finestra utilizzando uno strumento di estensione del display. Inoltre, quando utilizzano dispositivi pieghevoli, i giocatori possono modificare le dimensioni dello schermo durante una sessione di gioco.
  • Metodi di interazione: i giocatori possono fornire input toccando lo schermo di un dispositivo, ma possono anche utilizzare un mouse, un touchpad, una tastiera o un controller. Inoltre, la disponibilità di strumenti di estensione del display e di dispositivi pieghevoli consente ai giocatori di provare il tuo gioco su uno schermo più grande, rendendo più fattibili sessioni di gioco più lunghe e interfacce più complesse.
  • Supporto hardware:alcuni dispositivi con Android non dispongono di hardware più tipico di un dispositivo portatile, come una fotocamera posteriore, un GPS e la connettività di rete. Il gioco deve adattarsi all'hardware disponibile e gestire correttamente le situazioni in cui alcune funzionalità non sono disponibili.

Questa guida presenta le best practice relative allo sviluppo del gioco per diversi tipi di schermi e interazioni utente. Questa guida fornisce anche suggerimenti su come progettare il gioco e sviluppare una strategia di test efficace.

Best practice per la progettazione di giochi

Quando pianifichi la progettazione e l'architettura del tuo gioco, segui le best practice descritte nelle sezioni seguenti.

Rispondere manualmente alle modifiche alla configurazione

Quando il sistema Android rileva una modifica alla configurazione, ad esempio una modifica delle dimensioni dello schermo, dell'orientamento dello schermo o del metodo di input, il sistema riavvia per impostazione predefinita l'attività corrente. Per preservare lo stato all'interno di un'app o di un gioco, l'attività per impostazione predefinita chiama onSaveInstanceState() prima del riavvio e onRestoreInstanceState() dopo il riavvio. Questo processo, tuttavia, richiede il ricaricamento di tutti i servizi e le risorse associati all'attività. Per scoprire di più su questo comportamento predefinito, consulta la guida alla gestione delle modifiche alla configurazione.

Una tipica sessione di gioco subisce diverse modifiche alla configurazione. Se il tuo gioco consente al sistema di gestire ogni modifica della configurazione, la scena del gioco viene distrutta e riavviata più volte, riducendo le prestazioni del gioco. Per questo motivo, ti consigliamo vivamente di gestire personalmente queste modifiche alla configurazione nel tuo gioco.

Per scoprire come aggiungere questa logica di modifica della configurazione al tuo gioco, consulta la sezione su come creare gestori di modifiche della configurazione personalizzati.

Creare un'architettura flessibile

Per aggiungere il supporto del tuo gioco al maggior numero possibile di dispositivi, segui queste best practice:

  • Esegui il deployment di Android App Bundle anziché di singoli APK. I bundle Android App ti consentono di raggruppare artefatti di diverse risoluzioni e diversi modelli di architettura, ad esempio x86, ARM, in un unico artefatto. Ancora meglio, gli Android App Bundle supportano limiti di dimensioni più elevati per il tuo gioco: ogni APK di base può avere una dimensione massima di 150 MB e l'app bundle può avere una dimensione di molti gigabyte.
  • Aggiungi il supporto per le architetture x86. Questo passaggio migliora le prestazioni del gioco sui dispositivi che non supportano ARM, perché questi dispositivi ora possono eseguire le istruzioni senza doverle tradurre prima.

Aggiunta del supporto per Vulkan

Supportando Vulkan, il tuo gioco può ottenere prestazioni grafiche più elevate. La maggior parte dei dispositivi supporta questa API grafica.

Crea gestori di modifiche alla configurazione personalizzati

Per dichiarare i tipi di modifiche alla configurazione che il tuo gioco gestisce autonomamente, aggiungi l'attributo android:configChanges a ogni elemento <activity> nel manifest che rappresenta una schermata o un'interfaccia complessa.

Il seguente snippet di codice mostra come dichiarare che il gioco gestisce le modifiche alle dimensioni dello schermo, all'orientamento dello schermo e al metodo di input:

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

Quando si verificano le modifiche alla configurazione dichiarata, il sistema ora richiama un metodo diverso, onConfigurationChanged(). All'interno di questo metodo, aggiungi la logica per aggiornare la UI del gioco:

Gestire le modifiche alla configurazione dello schermo

Il gioco gestisce manualmente le modifiche alle dimensioni e all'orientamento dello schermo ogni volta che includi i valori screenSize e orientation, rispettivamente, in un attributo android:configChanges. Puoi utilizzare questi nuovi valori per aggiornare i contenuti e le aree di input del player della scena. Per indicazioni su come progettare il layout del gioco in modo da semplificarne l'aggiornamento, consulta la guida al supporto di diverse dimensioni dello schermo.

Nell'implementazione di onConfigurationChanged() del gioco, utilizza l'oggetto Configuration passato e l'oggetto Display di Window Manager per determinare i valori aggiornati per le dimensioni e l'orientamento dello schermo, rispettivamente.

Il seguente snippet di codice mostra come ottenere le dimensioni e l'orientamento dello schermo aggiornati del tuo gioco:

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

Tieni presente che la modifica della postura di un dispositivo pieghevole cambia la configurazione, anche se la tua app viene eseguita in modalità a schermo intero. Di conseguenza, la tua app potrebbe dover gestire le modifiche alle dimensioni dello schermo o alla densità dei pixel se l'utente piega o apre il dispositivo mentre il gioco è in esecuzione.

Qualità dello schermo specifiche per i giochi

Le sezioni seguenti descrivono come regolare la reazione del gioco alle modifiche delle dimensioni o dell'orientamento dello schermo, a seconda delle qualità del gioco:

Modalità a schermo intero

Su alcune piattaforme, come ChromeOS, le app e i giochi per Android possono essere ridimensionati e ridimensionati per impostazione predefinita. Se il tuo gioco deve essere sempre eseguito in modalità a schermo intero, puoi impostare l'attributo android:resizeableActivity su false in uno degli elementi <activity>, come mostrato nello snippet di codice seguente:

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

Puoi anche impostare l'attributo android:resizeableActivity su false per impedire che si verifichino modifiche alla configurazione in base alle dimensioni. A meno che il gioco non venga sempre eseguito in modalità a schermo intero, devi aggiungere questo attributo solo come correzione temporanea a scopo di test.

Orientamento schermo

Se il tuo gioco dipende dall'orientamento specifico dei sensori di un dispositivo, specifica un valore per android:screenOrientation nell'attività del tuo gioco, come mostrato nel seguente snippet di codice. Questa impostazione aiuta a impedire che una scena del gioco si capovolga in modo imprevisto.

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

Qualità dello schermo specifiche per dispositivo

Le sezioni seguenti descrivono come gestire le modifiche alla configurazione basate sullo schermo in base alle qualità specifiche di alcuni dispositivi.

Proporzioni

Alcuni dispositivi supportano proporzioni diverse. Ad esempio, i dispositivi pieghevoli sono progettati per supportare un formato 21:9 quando sono chiusi. Per gestire questa potenziale varietà di proporzioni, esegui almeno una delle seguenti operazioni:

  • Scegli come target Android 8.0 (livello API 26) o versioni successive.
  • Rendere ridimensionabili la scena e l'interfaccia del gioco. Imposta android:resizeableActivity su true sui dispositivi con Android 7.0 (livello API 24) e versioni successive.
  • Dichiara un formato massimo supportato. In un attributo <meta-data> associato al tuo gioco, imposta android.max_aspect su 2.4, come mostrato nel seguente snippet di codice. Tieni presente, tuttavia, che i formati più grandi di quello che hai specificato fanno sì che il gioco venga visualizzato letterbox all'interno di un display.

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

Più attività visibili contemporaneamente

Molti dispositivi moderni supportano una serie di layout dello schermo, tra cui schermo diviso, picture in picture e aree di visualizzazione di grandi dimensioni. Quando utilizzi uno di questi layout, il sistema può rendere visibili più attività contemporaneamente.

Sui dispositivi con Android 9 (livello API 28) o versioni successive, è possibile riprendere contemporaneamente tutte le attività visibili in primo piano. Affinché questo comportamento funzioni, tuttavia, sia il gioco che l'OEM del dispositivo devono attivare la funzionalità. Puoi aggiungere il supporto all'interno del gioco impostando android.allow_multiple_resumed_activities su true nel manifest del gioco, come mostrato nel seguente snippet:

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

Puoi quindi testare il gioco su diversi dispositivi per vedere quali di questi forniscono il supporto OEM necessario per il corretto funzionamento della ripresa multipla.

Per saperne di più sulla configurazione del gioco in modo che venga visualizzato come parte di un display multi-finestra, consulta la guida su come aggiungere il supporto multi-finestra.

Gestire diversi tipi di modelli di interazione

Il gioco gestisce manualmente la presenza e la disponibilità della tastiera ogni volta che includi i valori keyboard e keyboardHidden, rispettivamente, in un attributo android:configChanges. Puoi utilizzare questi nuovi valori per aggiornare il metodo di input principale del gioco.

Quando configuri il gioco per supportare più tipi di input utente, tieni presente quanto segue:

  • Rileva i metodi di input anziché i singoli dispositivi. Questo approccio rende più facile migliorare l'esperienza dei giocatori senza concentrarsi troppo sul dispositivo specifico che potrebbero avere.
  • Includi l'attributo keyboardHidden nell'elenco delle modifiche alla configurazione gestite manualmente. In questo modo, il gioco può tenere traccia di quando una tastiera è fisicamente collegata al dispositivo ma inutilizzabile.
  • Determina i metodi di input attualmente disponibili. Per farlo, chiama getInputDeviceIds() all'avvio del gioco e dopo ogni modifica alla configurazione.

    Spesso puoi determinare il modo in cui il giocatore intende interagire con il tuo gioco in base al dispositivo di input preferito:

    • I giocatori in genere utilizzano una tastiera o un controller di gioco per eseguire sequenze di pulsanti rapide.
    • I giocatori in genere utilizzano un touchscreen o un touchpad per eseguire gesti più complessi.
    • I giocatori in genere utilizzano un mouse per un input più preciso.

Le sezioni seguenti forniscono le best practice per tipi specifici di dispositivi di input.

Tastiera

Quando crei un layout della tastiera per il tuo gioco, considera il modo in cui il giocatore naviga in una determinata scena e come interagisce con le impostazioni del gioco.

I tasti WASD o i tasti freccia sono in genere i migliori per controllare il movimento del personaggio. Inoltre, è consigliabile assegnare un tasto specifico a ogni azione o abilità importante che un personaggio controllabile può eseguire all'interno del gioco. Per massimizzare l'esperienza del giocatore, valuta la possibilità di aggiungere il supporto per le assegnazioni di tasti personalizzate nel tuo gioco.

I giocatori devono anche essere in grado di aprire i menu del gioco e navigare al loro interno utilizzando la tastiera. Il tasto Esc è una mappatura comune per mettere in pausa una scena e mostrare il menu del gioco.

Per saperne di più sul supporto dell'input da tastiera nel tuo gioco, consulta la guida su come supportare la navigazione da tastiera e la guida su come gestire le azioni da tastiera.

Controller di gioco

Per ulteriori informazioni sulla gestione dell'input del controller nel gioco, consulta la guida su come supportare i controller di gioco.

Mouse o touchpad

Se il tuo gioco supporta l'input del giocatore da un mouse o un touchpad, tieni presente che i giocatori interagiscono con il dispositivo in modi diversi dal gioco. È importante sapere che, richiedendo l'acquisizione del puntatore, tutti gli input del mouse vengono indirizzati al gioco. Pertanto, dopo che il gioco ha le informazioni necessarie, rilascia l'acquisizione del puntatore in modo che i giocatori riacquistino il controllo standard del mouse del proprio dispositivo.

Sui dispositivi con Android 8.0 (livello API 26) e versioni successive, puoi utilizzare l'API Mouse Capture per facilitare la procedura di acquisizione del puntatore. Nei giochi che reagiscono all'input di alta precisione, puoi ottenere le coordinate attuali del puntatore chiamando i metodi getX() e getY().

Per ulteriori informazioni sull'aggiunta del supporto per l'input del mouse e del touchpad nel tuo gioco, consulta la guida su come monitorare i movimenti del tocco e del puntatore e la guida su come gestire i gesti multitocco.

Testare il gioco

Prima di lanciare il gioco, testa la sua risposta alle modifiche alla configurazione completando i passaggi descritti nelle sezioni seguenti.

Aggiornare il piano di test

Quando convalidi la funzionalità del gioco, includi i seguenti scenari di test:

  • Riduci a icona e ingrandisci la finestra che contiene il gioco. (Non si applica se il gioco è sempre in modalità schermo intero.)
  • Modificare le dimensioni dello schermo.
  • Modificare l'orientamento dello schermo. (Non si applica se il gioco ha un orientamento fisso.)
  • Collegare e scollegare dispositivi di input, come tastiere e mouse.
  • Esegui la ripresa multipla, se il gioco la supporta.

Inoltre, valuta la possibilità di aggiornare il sistema di controllo qualità del tuo gioco in modo da poterlo ottimizzare per una gamma più ampia di esperienze dei giocatori.

Per le best practice relative al test del gioco, consulta la guida alle nozioni di base dei test.

Utilizzare strumenti di test e debug

Puoi eseguire test utilizzando una serie di strumenti supportati dalla piattaforma: