Sviluppa giochi per tutti gli schermi

Durante lo sviluppo di un gioco per Android, è importante prevedere la varietà delle possibili esperienze dei giocatori e adattarsi alle esigenze di interazione in tempo reale del giocatore. Supportando esperienze diverse per i giocatori, aumenti la flessibilità del gameplay, contribuendo ad ampliare la portata del gioco.

Di seguito sono riportate alcune differenze specifiche nell'esperienza dei giocatori:

  • Fattori di forma del dispositivo: sebbene i telefoni offrano l'esperienza tradizionale sui dispositivi Android, è possibile interagire con i giochi su altri fattori di forma. I dispositivi ChromeOS possono eseguire un contenitore Android che mostra il tuo gioco. I tablet che supportano Android supportano diversi livelli di fedeltà. I dispositivi Android TV supportano esperienze più ricche di dettagli e coinvolgenti. I player possono simulare un ambiente multi-finestra utilizzando uno strumento di estensione display. Quando utilizzano i 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 display e di dispositivi pieghevoli consente ai giocatori di sperimentare il gioco su uno schermo più grande, rendendo più possibili sessioni di gioco più lunghe e interfacce più complesse.
  • Supporto hardware: alcuni dispositivi Android non hanno un hardware che è più tipico di un dispositivo portatile, ad esempio una fotocamera posteriore, un GPS e la connettività di rete. Il gioco dovrebbe adattarsi all'hardware disponibile e gestire agevolmente le situazioni in cui determinate funzionalità non sono disponibili.

Questa guida presenta le best practice relative allo sviluppo del tuo gioco per diversi tipi di schermi e interazioni degli utenti. Inoltre, fornisce suggerimenti su come progettare il tuo gioco e sviluppare un'efficace strategia di test.

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 di configurazione, ad esempio una variazione delle dimensioni dello schermo, dell'orientamento o del metodo di immissione, per impostazione predefinita il sistema riavvia l'attività corrente. Per mantenere lo stato all'interno di un'app o di un gioco, per impostazione predefinita l'attività chiama onSaveInstanceState() prima del riavvio e onRestoreInstanceState() dopo il riavvio. Questo processo, tuttavia, richiede che l'attività ricarichi tutti i servizi e le risorse associati. Per scoprire di più su questo comportamento predefinito, consulta la guida alla gestione delle modifiche alla configurazione.

Una tipica sessione di gameplay è soggetta a diverse modifiche di configurazione. Se il gioco consente al sistema di gestire ogni modifica alla configurazione, la scena del gioco viene distrutta e riavviata più volte, riducendo le prestazioni del gioco. Per questo motivo, ti consigliamo vivamente di gestire autonomamente 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 personalizzati.

Crea un'architettura flessibile

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

  • Esegui il deployment di Android App Bundle anziché di singoli APK. Android App Bundle consente di pacchettizzare in un unico artefatto elementi di diverse soluzioni e modelli di architettura, come x86 e ARM. Meglio ancora, Android App Bundle supporta limiti di dimensioni più elevati per il tuo gioco; ogni APK di base può avere dimensioni fino a 150 MB, mentre il bundle stesso può avere dimensioni di molti gigabyte.
  • Aggiungi il supporto per le architetture x86. Questo passaggio migliora le prestazioni del tuo gioco sui dispositivi che non supportano ARM, perché questi dispositivi possono ora eseguire istruzioni senza dover prima tradurle.

Aggiungi il supporto per Vulkan

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

Creare gestori personalizzati delle modifiche alla configurazione

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

Il seguente snippet di codice mostra come dichiarare che il tuo gioco si occupa delle modifiche alle dimensioni e all'orientamento dello schermo, nonché alle modifiche del metodo di immissione:

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

Quando si verificano le modifiche alla configurazione dichiarate, il sistema ora richiama un metodo diverso, onConfigurationChanged(). Nell'ambito di questo metodo, aggiungi una logica per aggiornare l'interfaccia utente del gioco:

Gestire le modifiche alla configurazione dello schermo

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

Nell'implementazione di onConfigurationChanged() del tuo gioco, utilizza rispettivamente l'oggetto Configuration passato e l'oggetto Display di gestore finestre per determinare i valori aggiornati relativi alle dimensioni e all'orientamento dello schermo.

Il seguente snippet di codice mostra come ottenere le dimensioni e l'orientamento aggiornati dello schermo del 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 posizione di un dispositivo pieghevole cambia la configurazione, anche se l'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 apre o piega 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 variazioni delle dimensioni o dell'orientamento dello schermo, a seconda delle qualità del gioco:

Modalità a schermo intero

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

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

Puoi anche impostare l'attributo android:resizeableActivity su false per impedire che vengano apportate modifiche alla configurazione basata sulle dimensioni. Tuttavia, a meno che il tuo gioco non venga sempre eseguito in modalità a schermo intero, dovresti aggiungere questo attributo solo come correzione temporanea a scopo di test.

Orientamento dello schermo

Se il gioco dipende dai sensori del dispositivo che hanno un orientamento specifico, specifica un valore per android:screenOrientation nell'attività del gioco, come mostrato nel seguente snippet di codice. Questa impostazione consente di evitare che una scena del gioco si capovolga inaspettatamente.

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

Qualità dello schermo specifiche per dispositivo

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

Proporzioni

Alcuni dispositivi supportano proporzioni diverse. Ad esempio, i dispositivi pieghevoli sono progettati per supportare proporzioni pari a 21:9 quando sono piegati. Per gestire questa potenziale varietà nelle proporzioni, esegui almeno una delle seguenti operazioni:

  • Scegli come target Android 8.0 (livello API 26) o versioni successive.
  • Rendi la scena e l'interfaccia del gioco ridimensionabili. Imposta android:resizeableActivity su true sui dispositivi con Android 7.0 (livello API 24) e versioni successive.
  • Dichiara le proporzioni massime supportate. In un attributo <meta-data> associato al tuo gioco, imposta android.max_aspect su 2.4, come mostrato nel seguente snippet di codice. Tuttavia, tieni presente che le proporzioni più grandi di quelle specificate fanno sì che il gioco venga visualizzato come 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 vari layout dello schermo, tra cui schermo diviso, Picture in picture e ampie aree di visualizzazione. Quando usi 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à principali visibili. Affinché questo comportamento funzioni, tuttavia, sia il tuo gioco sia l'OEM del dispositivo devono attivare questa funzionalità. Puoi aggiungere supporto all'interno del tuo gioco impostando android.allow_multiple_resumed_activities su true nel file 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 forniscono il supporto OEM necessario per il corretto funzionamento della ripresa multipla.

Per ulteriori informazioni sulla configurazione del tuo 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 sulla tastiera e la disponibilità della tastiera ogni volta che includi rispettivamente i valori keyboard e keyboardHidden in un attributo android:configChanges. Puoi usare questi nuovi valori per aggiornare il metodo di inserimento principale del gioco.

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

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

    Spesso puoi stabilire in che modo il giocatore intende interagire con il gioco in base al suo dispositivo di input preferito:

    • In genere i giocatori utilizzano una tastiera o un controller di gioco per eseguire sequenze di pulsanti rapide.
    • In genere i giocatori usano un touchscreen o un touchpad per eseguire gesti più complessi.
    • In genere i player utilizzano un mouse per eseguire input con precisione superiore.

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

Tastiera

Quando crei un layout da tastiera per il tuo gioco, valuta 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 ideali per controllare lo spostamento dei caratteri. È anche meglio assegnare un tasto particolare a ogni azione o abilità importante che un personaggio controllabile può eseguire all'interno del gioco. Per massimizzare l'esperienza di gioco, valuta la possibilità di aggiungere il supporto per associazioni di tasti personalizzate nel tuo gioco.

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

Per ulteriori informazioni 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 tuo gioco, consulta la guida relativa al supporto dei controller di gioco.

Mouse o touchpad

Se il tuo gioco supporta l'input del giocatore tramite mouse o touchpad, tieni presente che i giocatori interagiscono con il dispositivo in modi diversi dal gioco. È importante tenere presente che, se si richiede l'acquisizione del puntatore, tutto l'input del mouse viene indirizzato al gioco. Pertanto, una volta che il gioco dispone delle informazioni necessarie, rilascia l'acquisizione del puntatore in modo che i giocatori riprendano il controllo standard del mouse del loro dispositivo.

Sui dispositivi con Android 8.0 (livello API 26) e versioni successive, puoi utilizzare l'API Mouse Capture per facilitare il processo di acquisizione del puntatore. Nei giochi che reagiscono a 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 rilevare i movimenti del tocco e del puntatore, nonché la guida alla gestione dei gesti multi-touch.

Testare il gioco

Prima di lanciare il gioco, verifica come risponde alle modifiche alla configurazione completando i passaggi descritti nelle sezioni seguenti.

Aggiornare il piano di test

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

  • Riduci a icona e ingrandisci la finestra contenente il gioco. (non applicabile se il gioco è sempre in modalità a schermo intero).
  • Modificare le dimensioni dello schermo.
  • Modifica l'orientamento dello schermo. (non applicabile se il gioco ha un orientamento fisso).
  • Consente di collegare e scollegare dispositivi di input, come tastiere e mouse.
  • Esegui il ripristino multiplo, se il gioco lo supporta.

Valuta anche la possibilità di aggiornare il sistema di controllo qualità del gioco in modo da poter ottimizzare per una gamma più ampia di esperienze dei giocatori.

Per le best practice relative ai test del tuo gioco, consulta la guida ai concetti di base dei test.

Utilizzare strumenti di test e debug

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