Iniziare a sviluppare giochi in Unity

Questa guida delinea un tipico ciclo di sviluppo dei giochi. Dopo aver letto questa guida, potrebbe esserti utile utilizzarla anche come riferimento.

Quando lavori con Unity, il ciclo di vita dello sviluppo prevede tre fasi:

  • Pianifica e progetta
  • Sviluppa e testa
  • Pubblica e gestisci

Pianifica e progetta

Nella fase di pianificazione e progettazione, stabilisci come creare il tuo gioco. Devi decidere come affrontare le sfide dello sviluppo per dispositivi mobili e identificare gli strumenti e i processi da utilizzare nello sviluppo.

Ricevi input da tutti i membri del team

Collabora con i tuoi team di arte, progettazione, progettazione, audio e produzione per identificare e registrare le attività di implementazione. Ecco alcuni esempi:

  • I team artistici possono creare budget di texture e mesh degli asset per personaggi e ambienti.
  • Il team di progettazione potrebbe determinare i checkpoint di memoria e prestazioni per la profilazione in base a ciascuna piattaforma.
  • Il design può pianificare le meccaniche di gioco che consentono l'esperienza.
  • Gli esperti di audio potrebbero rivedere i requisiti di continuità del suono tra suoni spaziali UI, 2D e 3D.
  • La produzione potrebbe comunicare i requisiti di lancio e tenere il team allineato e sulla strada giusta.

Progetta per i dispositivi mobili

Lo sviluppo di applicazioni per piattaforme mobile prevede considerazioni specifiche, quali:

  • Proporzioni variabili dello schermo
  • Consumo energetico
  • Limitazione termica e del processore
  • Input tocco
  • Sviluppo su più piattaforme
  • API grafiche (Vulkan o OpenGL ES)

Per informazioni dettagliate sulle considerazioni specifiche per la progettazione per i dispositivi mobili, consulta lo sviluppo Android in Unity di Unity e la pagina di Google Play Academy.

Sviluppa e testa

Nella fase di sviluppo e test, crei il gioco, esegui i test e la preparazione pre-lancio. Esegui alcuni test interni limitati su Google Play per prepararti a soddisfare i requisiti di lancio. Puoi perfezionare la strategia di deployment e organizzare gli asset in Unity in base ai sistemi Play Asset Delivery e Addressables di Unity.

Le seguenti sezioni descrivono gli strumenti e le tecniche Unity progettati per aiutarti a sviluppare soluzioni per Android.

Rendering

Il rendering è il processo di disegno degli asset 3D e 2D della scena Unity sullo schermo. Anche se il motore Unity gestisce il rendering, è importante considerare alcuni fattori per la piattaforma Android.

Trame

Stabilisci se hai bisogno delle dimensioni più grandi delle texture, in base ai tuoi dispositivi target. Quando profila l'allocazione della memoria, esamina i potenziali risparmi derivanti dalla modifica della dimensione della trama di destinazione.

Durata frame

Per evitare il surriscaldamento sui dispositivi Android, imposta in media valori di durata frame inferiori a 21 millisecondi. A volte, ad esempio durante il caricamento o durante le esperienze cinematografiche brevi, la durata frame può superare i 21 millisecondi, ma dovresti rimanere al di sotto della soglia dei 21 millisecondi per l'esperienza di gioco principale.

Sulle piattaforme mobile, VSync forzato limita la frequenza fotogrammi se non raggiungi il target minimo. Ad esempio, con un aggiornamento dello schermo a 60 Hz, se non raggiungi i 60 fps, il gioco viene limitato a 30 Hz; se non raggiungi i 30, viene limitato a 15.

Molti dispositivi Android offrono frequenze di aggiornamento del display pari a 60 e 120 Hz. Valuta i vantaggi di scegliere come target tempi di frame molto più ridotti (target di 10 ms per l'aggiornamento a 60 Hz e 5 ms per 120 Hz) senza rischiare di limitazione termica e consumo della batteria con velocità di rendering più elevate.

Per impostare una frequenza fotogrammi specifica nel tuo gioco su Unity, utilizza Application.targetFrameRate.

La libreria di pacing dei frame di Android ti consente di mostrare in modo fluido quando la tua applicazione richiede più tempo per presentare il frame successivo rispetto a quanto richiesto dalla frequenza di aggiornamento dello schermo. Per Unity 2021 e versioni successive, l'attivazione del pacing di frame Android imposta la frequenza di aggiornamento del display in modo che corrisponda meglio alla frequenza frame target. Ciò garantisce che il gioco non sprechi batteria per aggiornamenti non necessari del display.

Per attivare la raccolta, in Impostazioni progetto > Player e in Impostazioni per Android, seleziona la casella di controllo Pacing del frame ottimizzato.

Finestra di dialogo che mostra Impostazioni progetto > Impostazioni giocatore > Pacing fame ottimizzato
Figura 1. Il pacing ottimizzato dei frame è disponibile nella sezione Impostazioni del player in Unity 2019.2 e versioni successive.

API Vulkan

Vulkan è un'API di grafica 3D multipiattaforma e ad alte prestazioni che offre un overhead ridotto rispetto a OpenGL ES. Unity può usare Vulkan in due modi diversi.

API Auto Graphics

Puoi utilizzare l'API Auto Graphics con Vulkan, ma può avere comportamenti diversi a seconda della versione di Unity installata. Per selezionare questa opzione, vai a Impostazioni progetto > Player > Rendering.

Quando scegli la versione di Unity da utilizzare, tieni presente quanto segue:

  • Unity 2021.1 e versioni precedenti non supportano Vulkan con l'API Auto Graphics. Unity prova a utilizzare OpenGL ES 3.2. Se il dispositivo non supporta OpenGL ES 3.2, Unity torna a OpenGL ES 3.1, 3.0 o 2.0, in questo ordine.
  • Unity 2021.2 e versioni successive utilizza prima Vulkan. Se il dispositivo non supporta Vulkan, Unity torna a OpenGL ES 3.2, 3.1, 3.0 o 2.0.
Impostazioni progetto > Impostazioni player > Rendering > API Auto Graphics
Figura 2. l'impostazione dell'API Auto Graphics.

API grafiche manuali

In alternativa, puoi abilitare Vulkan manualmente disabilitando l'API Auto Graphics. Se utilizzi Unity 2021.1 o una versione precedente, questo è l'unico modo per utilizzare Vulkan.

Se Vulkan è in una posizione superiore in questo elenco rispetto a OpenGL ES, Unity prova prima a utilizzare Vulkan. Se il dispositivo non supporta Vulkan, Unity viene eseguito con OpenGL ES. Consulta la guida introduttiva a Vulkan per informazioni dettagliate su Vulkan su Android, ad esempio come utilizzare API grafiche moderne e ottimizzare le prestazioni del tuo gioco.

Impostazioni progetto > Impostazioni del player > Rendering > API grafiche
Figura 3. Imposta manualmente le API grafiche quando l'API Auto Graphics è disabilitata. Vulkan è la prima opzione. Unity torna su OpenGL ES 3.0.

Chiamate di disegno

Tutto ciò che è visualizzato sullo schermo è associato a una o più chiamate di disegno. Sulle piattaforme per dispositivi mobili, devi ottimizzare e ridurre il numero di chiamate di disegno inviate alla GPU (Graphics Processing Unit).

Calcola le chiamate come se fossero automobiliste in fila a un semaforo. Quando la spia diventa verde, può passare un certo numero di auto prima che la luce cambi. Quando la spia diventa gialla, hai raggiunto la durata frame target ideale (21 millisecondi) e, quando la spia diventa rossa, hai raggiunto il limite di tempo di frame di 33 millisecondi. Tutto ciò che ha un impatto sul frame del rendering successivo, quindi la frequenza fotogrammi risultante è inferiore ai 30 fps target.

Per informazioni su come migliorare le prestazioni delle chiamate di disegno nel tuo gioco, consulta l'articolo sul batch dell'assistenza Unity.

Shadows

Le chiamate di disegno con shadowing possono essere le operazioni più impegnative della GPU e il dispendio di tempo della GPU anche in ambienti semplici. Per ridurre il costo delle chiamate di disegno con shadowing, prova a usare ombre nette invece di ombre sfumate. Se questo è ancora troppo costoso per la GPU per i dispositivi di fascia bassa, valuta l'utilizzo di ombreggiature blob anziché ombre rigide.

Texture

Il formato di compressione delle texture consigliato per le texture RGB e RGBA su Android è ASTC. In Unity, l'opzione di compressione minima delle texture da utilizzare su Android è ETC2. Puoi utilizzare ETC2 come backup da ASTC in Impostazioni build Unity.

Un elenco completo dei formati supportati per piattaforma è disponibile nella documentazione di Unity nella pagina Manuale: formati di texture consigliati, predefiniti e supportati, per piattaforma.

Interfaccia utente e proporzioni

Puoi utilizzare lo strumento Simulatore di dispositivo Unity per visualizzare l'anteprima delle diverse risoluzioni, orientamenti e proporzioni dello schermo dei dispositivi direttamente nell'editor di Unity. Puoi spostarti tra la visualizzazione Gioco e la visualizzazione Simulatore del dispositivo.

Per un'anteprima dello strumento, vedi Simula il gioco con il Simulatore di dispositivi in Unity.

Figura 4. Simulatore di dispositivi con Trivial Kart.

Puoi trovare il codice sorgente Trivial Kart nel repository games-samples su GitHub.

Puoi verificare rapidamente il layout e la correttezza degli elementi canvas dell'interfaccia utente nella visualizzazione Simulatore di dispositivi selezionando le opzioni del dispositivo nel menu a discesa:

Impostazioni progetto > Impostazioni del player > Pacing frame ottimizzato
Figura 5. Il Simulatore di dispositivo supporta il cambio di dispositivo all'interno dell'editor, per consentirti di individuare tempestivamente i problemi di progettazione.
Impostazioni progetto > Impostazioni giocatore > Pacing fame ottimizzato
Figura 6. Seleziona Abilita pacchetti di pre-release prima di scaricare il pacchetto del simulatore del dispositivo.

Per ulteriori tecniche di ottimizzazione dell'interfaccia utente per Unity, consulta il seguente tutorial di Unity: Ottimizzazione della UI di Unity.

Fisica

Il motore Nvidia PhysX è integrato in Unity. Le impostazioni predefinite possono essere costose sui dispositivi mobili, quindi tieni presente quanto segue:

  • Considera la frequenza frame target e imposta di conseguenza un passo temporale fisso. Il valore predefinito è 0,02 ms o 50 Hz. Puoi aumentarlo fino a 0,03 o più alto per un target di 30 FPS.
  • Valuta la possibilità di semplificare i mesh collider e di ridurre al minimo la Layer Collision Matrix per determinare le interazioni tra oggetti di gioco di tipi di livelli specifici.

Per informazioni su impostazioni di fisica e ottimizzazioni per i giochi mobile, vedi l'ebook Optimize per i giochi mobile di Unity.

Profilo

Gli sviluppatori di app spesso trascurano o ignorano la profilazione fino a quando l'applicazione non raggiunge un punto di errore critico. È consigliabile programmare tempo di profilazione dedicato per il processo e utilizzare le seguenti best practice:

  • Identifica i punti chiave durante lo sviluppo quando puoi allocare il tempo di profilazione, invece di inserirli in modo casuale.
  • Salva gli snapshot del profilo da utilizzare con lo Analizzatore profili Unity.
  • Mostra il profilo del tuo gioco sui dispositivi di destinazione per avere un quadro preciso delle prestazioni del gioco nella fase attuale di sviluppo.
  • Profila diverse parti del tuo gioco.
  • Indica come giocano i tuoi giocatori. Non profilare il gioco solo quando è inattivo o in pausa.
  • Profilo in modalità prolungata dopo un po' di tempo in cui il gioco è in esecuzione per aiutare a individuare i problemi di limitazione che potresti riscontrare quando i dispositivi mobili sono surriscaldati.

Puoi utilizzare i seguenti strumenti di profilazione separatamente o in combinazione.

  • Unity Profiler Unity Profiler è uno strumento di analisi delle prestazioni completamente integrato che può essere eseguito sul tuo codice nell'editor Unity e connetterti al tuo dispositivo Android autonomo che esegue build in modalità di sviluppo.

  • Android GPU Inspector Con Android GPU Inspector (AGI) puoi eseguire il debug a livello di frame. AGI analizza inoltre i servizi di sistema, inclusi i contatori di GPU, CPU, memoria, batteria e GPU.

Per informazioni dettagliate sulla profilazione del tuo gioco in Unity, guarda il video Introduzione alla profilazione in Unity o leggi la Guida perfetta alla profilazione dei giochi Unity, entrambi di Unity.

Gestione della memoria

I processi Android condividono la memoria disponibile sul dispositivo di destinazione. Dovresti profilare l'utilizzo della memoria quando il dispositivo di test di destinazione dispone di ampie risorse di memoria libera. Esegui test della memoria in un punto coerente del gioco, in modo da poter confrontare le sessioni e le tendenze di utilizzo della memoria in modo appropriato.

Quando lavori in script scritti in C#, presta attenzione all'utilizzo di stringhe, confronti tra stringhe e allocazioni di oggetti relativi alle stringhe (ad esempio file JSON per le impostazioni di gioco). Queste generano allocazioni di memoria frequenti e possono contribuire alla frammentazione.

Potresti utilizzare la classe StringBuilder per grandi sequenze di manipolazione delle stringhe, tramite la concatenazione in loco di stringhe (ad esempio "this" + "is" + "a" + "bad" + "idea" rispetto a StringBuilder.Concat() chiamate di funzione).

Per ulteriori informazioni sulle stringhe, consulta Stringhe e testo nella documentazione di Unity.

Valuta le risorse di testo TextAsset e JSON rispetto al tipo ScriptableObject preferenziale. ScriptableObjects gestisce l'archiviazione dei dati tra le scene in modo efficiente e consente modifiche del tempo da Editor a Play.

Per una discussione sull'utilizzo di alternative all'handle JSON predefinito per l'ottimizzazione mobile, consulta l'articolo L'ottimizzazione nascosta nei giochi di rete su Hutch.

Utilizza l'API Memory Advice per determinare l'utilizzo della memoria in fase di runtime. L'API espone un indicatore a semaforo per un utilizzo elevato, normale e ridotto della memoria. Puoi iscriverti all'indicatore per gli aggiornamenti o eseguire direttamente il polling per conoscere lo stato attuale. Quando il segnale è rosso, prova a ridurre il numero di oggetti di gioco o la cache. Includi questo contesto nella telemetria del gioco durante le operazioni in tempo reale e nella revisione delle metriche sulle prestazioni dopo il lancio.

Per un'analisi più approfondita dell'organizzazione della memoria sui dispositivi Android e del funzionamento di Unity, guarda il video Informazioni sull'utilizzo della memoria di Android (da Google I/O '18). Il video illustra i tipi di problemi di memoria e i casi in cui si attiva l'eliminazione definitiva.

Raccolta rifiuti

La garbage collection in un ambiente di memoria gestito elimina i frammenti di memoria inutilizzati che possono essere riciclati per un'applicazione. Segui le best practice per la garbage collection per evitare allocazioni superflue di risorse di memoria.

Ad esempio, crea un pool di oggetti di gioco anziché utilizzare le allocazioni on demand (GameObject.Instantiate). Per i pool di grandi dimensioni, valuta la possibilità di assegnarli su più frame per ridurre il rischio che il gioco non risponda sui dispositivi Android di base.

Considera il seguente snippet di codice per una semplice coroutine richiamata dall'inizio di un comportamento MonoBehaviour:

// Option 1: Bad for memory management - causes allocation each iteration
IEnumerator UpdateEnemyTarget() {
  while (enabled) {
    yield return new WaitForSeconds(1.0f);
    // Some intermittent function check
  }
}

// Option 2: Better for memory management - allocation of yield instruction once, reused each iteration
private YieldInstruction waitForSecond = new WaitForSeconds(1.0f);
IEnumerator BetterUpdateEnemyTarget() {
  while (enabled) {
    yield return waitForSecond;
    // Some other intermittent function
  }
}

Puoi modificare il file del modello MonoBehaviour per rimuovere le funzioni stub Start() e Update() predefinite in modo da non lasciare inavvertitamente funzioni vuote durante lo sviluppo.

Per una panoramica dell'ordine di esecuzione degli eventi MonoBehaviour, consulta l'articolo sull'ordine di esecuzione delle funzioni evento nella documentazione di Unity. Per scoprire di più sulla gestione della memoria, vedi il corso Gestione della memoria in Unity.

Per suggerimenti sull'ottimizzazione delle prestazioni dei giochi mobile, consulta Ottimizzare le prestazioni dei giochi mobile: suggerimenti dei migliori tecnici di Unity su profilazione, memoria e architettura del codice.

Pool di prefabbricati

I picchi del tempo di frame della CPU sono quasi interamente causati dalla creazione di istanze prefabbricate durante il gameplay. Prova a preparare pool di oggetti per proiettili, nemici sparsi ed effetti visivi prima di entrare nel gameplay per ridurre o eliminare i picchi di CPU all'avvio. Puoi distribuire ulteriori ottimizzazioni su più "frame di inizializzazione" durante il caricamento o le sequenze di introduzione nella scena.

Su Unity Asset Store puoi trovare molte risorse di pooling di terze parti relative alla gestione del pool di oggetti di gioco. oppure crearne di personalizzate. Consulta Introduzione al pool di oggetti su Unity Learn.

Invio degli asset

Esistono dei limiti alle dimensioni dell'applicazione al momento del primo deployment su Google Play. A seconda delle dimensioni e della natura del gioco, potrebbero essere necessarie alcune o tutte le risorse di gioco (modelli di personaggi, ambienti, elementi UI e così via) per offrire ai giocatori l'esperienza che desideri.

Puoi utilizzare il servizio Play Asset Delivery (PAD) per gestire gli asset richiesti dal tuo gioco al momento dell'installazione, rapidamente o on demand. I pacchetti di asset Unity sono integrati per supportare PAD e puoi utilizzare questo strumento per specificare quali elementi vengono pubblicati.

Indirizzabili

La configurazione di risorse dinamiche, come prefabbricati, texture e file audio, in fase di runtime non è più un'operazione complessa se ti prepari e esamini il sistema di denominazione degli indirizzi. Gli asset indirizzabili disaccoppiano il modo in cui disponi i contenuti dal modo in cui crei e carichi i contenuti. Il sistema Indirizzabili sostituisce le cartelle Risorse e i pacchetti di asset per semplificare il modo in cui fai riferimento agli asset e caricarli al momento dell'attivazione.

Per un esempio, consulta la sezione Progetto dimostrativo utilizzando il pacchetto Addressables su GitHub. Per maggiori dettagli sullo sviluppo di Addressables, consulta la pagina dedicata all'Addressable Asset System sul blog di Unity.

Con il layout degli asset indirizzabili, comporta vantaggi e svantaggi nel raggruppare un numero insufficiente o troppi asset in bundle comuni. Per scoprire di più sulla gestione dei contenuti con Addressables, vedi Semplificare la gestione dei contenuti con Addressables.

Puoi configurare una demo autonoma e sperimentare le modalità di accesso per acquisire dimestichezza con il sistema Addressables. Puoi anche visualizzare il progetto open source BuildLayout Explorer per Unity 2019.3 e versioni successive e a esaminare il report buildlayout.txt generato da Addressables.

Gli asset di Chop Chop, un progetto aperto Unity, sono stati pacchettizzati utilizzando il sistema Addressables per tutte le operazioni di caricamento e unload. Consulta Packaging di contenuti con asset indirizzabili | Open Projects Devlog per una procedura dettagliata della struttura e della configurazione dei bundle Addressables.

Nel progetto Chop Chop, l'unica scena caricata per impostazione predefinita, quella di inizializzazione, è stata configurata in modo da utilizzare AssetReferences anziché i link diretti agli asset nel progetto (scene, prefabbricati e così via).

Il codice sorgente per Unity Open Project: Chop Chop è disponibile su GitHub. Sebbene il progetto non sia più in fase di sviluppo, il repository Git e la documentazione sono ancora disponibili.

Plug-in di terze parti

Se utilizzi plug-in di terze parti, ad esempio quelli nell'Archivio asset Unity, assicurati di esaminare le cartelle e rimuovere gli asset non necessari dalle cartelle Risorse. Durante il processo di compilazione, Unity raccoglie tutti gli asset inclusi nelle cartelle Resources e li pacchettizza in un unico bundle accessibile in fase di runtime. Questo può aggiungere dimensioni al pacchetto finale e spesso non è necessario.

Per individuare rapidamente tutte le cartelle delle risorse, cerca Risorse nel riquadro Progetto. Puoi quindi selezionarli per stabilire cosa contiene e se sono necessari per il tuo gioco.

Figura 7. Potrebbero esserci più cartelle Resources in agguato nelle cartelle scaricate da Unity Asset Store. Esegui la pulizia per evitare che vengano pacchettizzate nel tuo bundle di applicazioni.

Pubblica e gestisci

Quando è tutto pronto per lanciare il tuo gioco mobile, decidi per chi vuoi pubblicarlo, come eseguire gli alpha e beta test e come monitorare e monitorare le prestazioni dopo il lancio.

Analizzare il feedback relativo a una release limitata

Puoi lanciare il gioco per un pubblico limitato e mirato ed eseguire beta test su più larga scala oppure attivare il gioco affinché sia disponibile a tutti i mercati. Con una release limitata, puoi ottimizzare le prestazioni delle tue applicazioni in base a un pubblico dal vivo più ampio e a una raccolta di dispositivi.

Ad esempio, puoi utilizzare Android Performance Tuner per Unity e Google Analytics per Unity per ottenere informazioni dettagliate sulle prestazioni delle tue applicazioni e sulle tendenze dei giocatori, da cui il team di sviluppo può ottimizzare e inviare aggiornamenti. Puoi utilizzare i dati di analisi anche per pianificare sequel o giochi correlati di genere simile.

Alpha e beta test

Dopo aver configurato il profilo dell'applicazione in Google Play Console, puoi preparare build pubbliche di alpha e beta test e distribuirle a un pubblico limitato per la revisione pre-lancio. Con il lancio rivolto a un pubblico limitato, puoi risolvere eventuali problemi finali con un pool di dispositivi più ampio e raccogliere un feedback iniziale a cui puoi rispondere prima di procedere con la pubblicazione in una release globale.

Le tue build Unity vengono distribuite tramite Android App Bundle. Per informazioni, consulta il Manuale: caricamento in Google Play da Unity, che descrive anche le modifiche dai file APK al formato AAB.

Monitora e traccia

Durante la fase di live action e distribuzione del tuo gioco, puoi usare Android Vitals per tenere traccia dei problemi di prestazioni sui dispositivi a cui potresti non avere accesso durante lo sviluppo e il test. Per maggiori dettagli, guarda l'articolo Novità per i giochi in Copertura, dispositivi e Android vitals.

Spesso i team di sviluppo più grandi hanno pipeline di telemetria di gioco uniche e personalizzate che forniscono metriche relative alle prestazioni dei dispositivi. Ricordati di sfruttare Android Performance Tuner (APT) e il plug-in Unity corrispondente per accedere a metriche di connessione via telefono relative a frequenza fotogrammi, fedeltà grafica, tempo di caricamento e abbandono del caricamento. Segui la guida passo passo nell'articolo Integrare Android Performance Tuner nel tuo gioco Unity.

Il ciclo di vita del gioco non si interrompe dopo la pubblicazione. Monitorare, gestire e rispondere alle prestazioni e ai feedback è fondamentale per gli utenti soddisfatti, per le recensioni positive e per l'adozione ottimale del tuo gioco in tutti i mercati.