Iniziare a sviluppare giochi in Unity

Questa guida descrive un tipico ciclo di sviluppo di un gioco. Dopo aver letto questa guida, potresti trovarla utile anche come riferimento.

Quando lavori con Unity, il ciclo di vita dello sviluppo è costituito da tre fasi:

  • Pianificare e progettare
  • Sviluppare e testare
  • Pubblicare e gestire

Pianificare e progettare

Nella fase di pianificazione e progettazione, determini come creare il gioco. Decidi come affrontare le sfide dello sviluppo per il mobile e identifica gli strumenti e i processi da utilizzare nello sviluppo.

Ricevere il contributo di tutti i membri del team

Collabora con i team artistici, tecnici, di progettazione, audio e di produzione per identificare e registrare le attività di implementazione. Ad esempio:

  • I team artistici potrebbero creare budget per texture e mesh degli asset per personaggi e ambienti.
  • Il team di ingegneria potrebbe determinare i checkpoint di memoria e prestazioni per la profilazione rispetto a ciascuna piattaforma.
  • Il design potrebbe pianificare le meccaniche di gioco che consentono l'esperienza.
  • Gli esperti audio potrebbero esaminare i requisiti per la continuità del suono tra i suoni spaziali 2D, 3D e dell'interfaccia utente.
  • La produzione potrebbe comunicare i requisiti di lancio e mantenere il team allineato e in linea con i tempi.

Progettazione per i dispositivi mobili

Lo sviluppo di applicazioni per piattaforme mobile comporta considerazioni specifiche, ad esempio:

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

Per informazioni dettagliate sulle considerazioni specifiche per la progettazione per il mobile, consulta Sviluppo per Android in Unity di Unity e Google Play Academy.

Sviluppare e testare

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

Le sezioni seguenti descrivono strumenti e tecniche di Unity progettati per aiutarti a sviluppare per Android.

Render

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

Texture

Determina se hai bisogno delle dimensioni delle texture più grandi in base ai dispositivi di destinazione. Quando profili l'allocazione della memoria, esamina i potenziali risparmi derivanti dalla modifica delle dimensioni della texture di destinazione.

Durata frame

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

Sulle piattaforme mobile, la sincronizzazione verticale forzata limita la frequenza dei fotogrammi se non raggiungi il target minimo. Ad esempio, in un aggiornamento dello schermo a 60 Hz, se non raggiungi 60 fps, il gioco viene limitato a 30; se non raggiungi 30, viene limitato a 15.

Molti dispositivi Android vengono forniti con frequenze di aggiornamento del display di 60 Hz e 120 Hz. Valuta i vantaggi di un targeting di frame time molto più brevi (10 ms per l'aggiornamento a 60 Hz e 5 ms per 120 Hz) senza rischiare il throttling termico e il consumo della batteria per frequenze di rendering più elevate.

Per impostare una frequenza frame specifica nel tuo gioco in Unity, utilizza Application.targetFrameRate.

La libreria Frame Pacing di Android ti aiuta a eseguire il rendering in modo fluido quando l'applicazione impiega più tempo a presentare il frame successivo rispetto a quanto richiesto dalla frequenza di aggiornamento dello schermo. Per Unity 2021 e versioni successive, l'attivazione del pacing dei frame Android imposta la frequenza di aggiornamento del display in modo che corrisponda al meglio alla frequenza frame target. In questo modo, il gioco non spreca la batteria con aggiornamenti non necessari del display.

Per abilitare la libreria, in Project Settings > Player, seleziona la casella di controllo Optimized Frame Pacing in Settings for Android.

Finestra di dialogo che mostra Impostazioni progetto > Impostazioni player > Ritmo di visualizzazione ottimizzato
Figura 1. L'ottimizzazione del frame pacing è disponibile in Impostazioni del player in Unity 2019.2 e versioni successive.

API Vulkan

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

API Auto Graphics

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

Quando scegli la versione di Unity da utilizzare, tieni presente le seguenti considerazioni:

  • Unity 2021.1 e versioni precedenti non supportano Vulkan con l'API Auto Graphics. Unity tenta di utilizzare OpenGL ES 3.2. Se il dispositivo non supporta OpenGL ES 3.2, Unity utilizza OpenGL ES 3.1, 3.0 o 2.0, in quest'ordine.
  • Unity 2021.2 e versioni successive utilizzano prima Vulkan. Se il dispositivo non supporta Vulkan, Unity esegue il fallback a OpenGL ES 3.2, 3.1, 3.0 o 2.0.
Impostazioni progetto > Impostazioni giocatore > Rendering > API grafiche automatiche
Figura 2. Impostazione dell'API Auto Graphics.

API per la grafica manuale

In alternativa, puoi attivare Vulkan manualmente disattivando l'API grafica automatica. Se utilizzi Unity 2021.1 o una versione precedente, questo è l'unico modo per utilizzare Vulkan.

Se Vulkan è posizionato più in alto in questo elenco rispetto a OpenGL ES, Unity tenta prima di utilizzare Vulkan. Se il dispositivo non supporta Vulkan, Unity viene eseguito con OpenGL ES. Consulta la sezione Inizia a utilizzare Vulkan per informazioni dettagliate su Vulkan su Android, ad esempio come utilizzare le API grafiche moderne e ottimizzare le prestazioni del gioco.

Impostazioni progetto > Impostazioni giocatore > Rendering > API grafiche
Figura 3. Imposta manualmente le API grafiche quando l'API grafica automatica è disattivata. Vulkan è la prima opzione. Unity esegue il fallback a OpenGL ES 3.0.

Chiamate di disegno

Tutto ciò che viene visualizzato sullo schermo è associato a una o più chiamate di disegno. Sulle piattaforme mobile, devi ottimizzare e ridurre il numero di chiamate di disegno che inviate all'unità di elaborazione grafica (GPU).

Pensa alle draw call come alle auto in coda a un semaforo. Quando il semaforo diventa verde, un certo numero di auto può passare prima che il semaforo cambi. Quando la spia diventa gialla, hai raggiunto il tempo frame target ideale (21 millisecondi) e quando diventa rossa, hai raggiunto il limite di tempo frame di 33 millisecondi. Qualsiasi operazione successiva influisce sul frame di rendering successivo, quindi la frequenza fotogrammi risultante è inferiore a 30 fps target.

Per informazioni su come migliorare il rendimento delle chiamate di disegno nel tuo gioco, consulta l'articolo Batching del Centro assistenza Unity.

Shadows

Le chiamate di disegno per la proiezione delle ombre possono essere le più intensive per la GPU, consumando la maggior parte del tempo della GPU anche per ambienti semplici. Per ridurre il costo delle chiamate di disegno per la proiezione delle ombre, prova a utilizzare ombre nette anziché sfumate. Se questo è ancora troppo costoso sulla GPU per i dispositivi di fascia bassa, valuta la possibilità di utilizzare ombre blob anziché ombre nette.

Texture

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

Trova un elenco completo dei formati supportati per piattaforma nella documentazione di Unity all'indirizzo Manuale: formati di texture consigliati, predefiniti e supportati, per piattaforma.

Interfaccia utente e proporzioni

Puoi utilizzare lo strumento Simulatore di dispositivi di Unity per visualizzare in anteprima varie risoluzioni dello schermo, orientamenti e proporzioni dei dispositivi direttamente nell'editor Unity. Puoi passare dalla visualizzazione Gioco alla visualizzazione Simulatore di dispositivo.

Visualizza un'anteprima dello strumento all'indirizzo Simulate your Game with Device Simulator in Unity!.

Figura 4. Simulatore di dispositivo che esegue Trivial Kart.

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

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

Impostazioni progetto > Impostazioni player > Optimized Frame Pacing
Figura 5. Device Simulator supporta il cambio di dispositivo all'interno dell'editor, in modo da poter individuare i problemi di progettazione in anticipo.
Impostazioni progetto > Impostazioni giocatore > Ritmo di fama ottimizzato
Figura 6. Seleziona Enable Pre-release Packages prima di scaricare il pacchetto Device Simulator.

Per ulteriori tecniche di ottimizzazione della UI per Unity, consulta il seguente tutorial di Unity: Optimizing Unity UI.

Fisica

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

  • Considera la frequenza frame target e imposta di conseguenza il timestep fisso. Il valore predefinito è 0,02 ms o 50 Hz. Puoi aumentarlo a 0,03 o a un valore superiore per un target di 30 fps.
  • Valuta la possibilità di semplificare i mesh collider e ridurre al minimo la matrice di collisione dei livelli per determinare le interazioni tra gli oggetti di gioco di tipi di livelli specifici.

Per informazioni su impostazioni fisiche e ottimizzazioni per i giochi per dispositivi mobili, consulta l'eBook Ottimizza i tuoi giochi per dispositivi mobili di Unity.

Profilo

Gli sviluppatori di app spesso trascurano o ignorano la profilazione finché l'applicazione non raggiunge un punto di errore critico. È consigliabile programmare un tempo dedicato alla profilazione nel tuo processo e utilizzare le seguenti best practice:

  • Identifica i punti chiave durante lo sviluppo in cui puoi allocare il tempo di profilazione, anziché inserirlo in modo casuale.
  • Salva gli snapshot del profilo da utilizzare con Unity Profile Analyzer.
  • Esegui la profilazione del tuo gioco sui dispositivi di destinazione per ottenere un quadro preciso delle prestazioni del gioco nella fase di sviluppo attuale.
  • Profila diverse parti del gioco.
  • Crea un profilo del modo in cui i giocatori giocano. Non profilare il gioco solo quando è in stato di inattività o in una schermata di pausa.
  • Profilo in modalità sostenuta dopo che il gioco è in esecuzione da un po' di tempo per aiutarti a trovare problemi di limitazione che potresti riscontrare quando i dispositivi mobili sono caldi.

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 codice in Unity Editor e connettersi 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 anche i servizi di sistema, inclusi GPU, CPU, memoria, batteria e contatori GPU.

Per informazioni dettagliate sulla profilazione del gioco in Unity, guarda il video Introduction to profiling in Unity o leggi la Ultimate guide to profiling Unity games, entrambi di Unity.

Gestione della memoria

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

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

Valuta la possibilità di utilizzare la classe StringBuilder per sequenze di manipolazione di stringhe di grandi dimensioni, rispetto alla concatenazione in loco di stringhe (ad esempio "this" + "is" + "a" + "bad" + "idea" rispetto a chiamate di funzione StringBuilder.Concat()).

Per saperne di più sulle stringhe, consulta Stringhe e testo nella documentazione di Unity.

Valuta le risorse di testo TextAsset e JSON in base al tipo ScriptableObject preferenziale. ScriptableObjects gestisce in modo efficiente l'archiviazione dei dati tra le scene e consente modifiche 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'aspetto dell'utilizzo della memoria in fase di runtime. L'API espone un indicatore a semaforo per l'utilizzo della memoria alto, normale e basso. Puoi iscriverti all'indicatore per ricevere aggiornamenti o interrogarlo direttamente per conoscere lo stato attuale. Quando ricevi un segnale rosso, valuta la possibilità di ridurre il pool o la cache degli oggetti di gioco. Includi questo contesto nella telemetria del gioco durante le operazioni live e nella revisione delle metriche di rendimento dopo il lancio.

Per approfondire l'organizzazione della memoria sui dispositivi Android e il modo in cui Unity interagisce con essa, guarda Understanding Android memory usage (from Google I/O '18). Il video illustra i tipi di problemi di memoria e quando viene attivato il processo di eliminazione in caso di memoria insufficiente.

Garbage collection

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

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

Prendi in considerazione il seguente snippet di codice per una semplice coroutine richiamata dall'inizio di un 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 modello MonoBehaviour per rimuovere le funzioni stub predefinite Start() e Update() in modo da non lasciare inavvertitamente funzioni vuote durante lo sviluppo.

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

Per suggerimenti sull'ottimizzazione del rendimento dei giochi mobile, consulta Ottimizzare il rendimento del gioco mobile: suggerimenti su profilazione, memoria e architettura del codice dai migliori ingegneri di Unity.

Pool di prefabbricati

I picchi di tempo frame della CPU sono quasi interamente causati dall'istanza Prefab durante il gameplay. Valuta la possibilità di precaricare i pool di oggetti per proiettili, nemici generabili ed effetti visivi prima di iniziare a giocare per ridurre o eliminare i picchi di utilizzo della CPU all'avvio. Puoi distribuire le ottimizzazioni aggiuntive su più "frame di inizializzazione" durante il caricamento o le sequenze di introduzione nella scena.

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

Asset Delivery

Esistono limiti alle dimensioni della tua applicazione quando viene inizialmente implementata su Google Play. A seconda delle dimensioni e della natura del gioco, potresti aver bisogno di alcune o di tutte le risorse del gioco (modelli di personaggi, ambienti, elementi dell'interfaccia utente e così via) affinché i giocatori possano vivere l'esperienza che intendi offrire.

Puoi utilizzare il servizio Play Asset Delivery (PAD) per gestire le risorse richieste dal tuo gioco al momento dell'installazione, rapida successiva o on demand. Gli asset bundle di Unity sono integrati per supportare il file PAD e puoi utilizzare lo strumento per specificare quali elementi vengono pubblicati.

Addressables

La configurazione di risorse dinamiche, come prefabbricati, texture e file audio, in fase di runtime non è più un'operazione complessa se prepari e rivedi il sistema di denominazione degli asset indirizzabili. Gli asset indirizzabili separano il modo in cui disponi i contenuti dal modo in cui li crei e li carichi. Il sistema Addressables sostituisce le cartelle Resources e gli Asset Bundle per semplificare il modo in cui fai riferimento agli asset e li carichi in fase di runtime.

Per un esempio, vedi il progetto demo che utilizza il pacchetto Addressables su GitHub. Per informazioni dettagliate sullo sviluppo di Addressables, consulta Addressable Asset System sul blog di Unity.

Con il layout degli asset indirizzabili, il raggruppamento di un numero troppo basso o troppo alto di asset in bundle comuni presenta vantaggi e svantaggi. Per scoprire di più sulla gestione dei contenuti con Addressables, consulta Semplificare la gestione dei contenuti con Addressables.

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

Gli asset di Chop Chop, un progetto aperto di Unity, sono stati pacchettizzati utilizzando il sistema Addressables per tutti i caricamenti e gli scaricamenti. Consulta Packaging content with Addressable Assets | Open Projects Devlog per una procedura dettagliata della struttura e della configurazione dei bundle Addressables.

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

Il codice sorgente di 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 di Unity Asset Store, assicurati di esaminare le cartelle e rimuovere gli asset non necessari dalle cartelle Risorse. Durante il processo di compilazione, Unity raccoglie tutte le risorse incluse nelle cartelle Resources e le raggruppa in un unico bundle accessibile in fase di runtime. Questo può appesantire il pacchetto finale e spesso non è necessario.

Per individuare rapidamente tutte le cartelle delle risorse, cerca Risorse nel riquadro Progetto. Puoi quindi selezionare ciascun file per identificare il suo contenuto e se è necessario per il tuo gioco.

Figura 7. Potrebbero esserci più cartelle Resources nascoste nelle cartelle scaricate da Unity Asset Store. Esegui la pulizia per evitare che vengano inclusi nel bundle dell'applicazione.

Pubblicare e gestire

Quando sei pronto per lanciare il tuo gioco mobile, decidi a chi vuoi distribuirlo, come eseguire i test alpha e beta e come monitorare e tenere traccia del rendimento dopo il lancio.

Analizzare il feedback di una release limitata

Puoi lanciare il gioco per un pubblico limitato e mirato ed eseguire test beta su larga scala oppure attivarlo per la disponibilità completa in tutti i mercati. Con una release limitata, puoi ottimizzare le prestazioni dell'applicazione in base a un pubblico live 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 sul rendimento della tua applicazione e sulle tendenze dei giocatori, da cui il tuo team di sviluppo può ottimizzare e inviare aggiornamenti. Potresti anche utilizzare i dati di analisi per pianificare sequel o giochi correlati in un genere simile.

Test alpha e beta

Dopo aver configurato il profilo dell'applicazione in Google Play Console, puoi preparare build di test alfa e beta pubblici e distribuirli a un pubblico limitato per la revisione pre-lancio. Se esegui il lancio per un pubblico limitato, puoi risolvere eventuali problemi finali con un pool più ampio di dispositivi e raccogliere feedback iniziali a cui rispondere prima di pubblicare l'app a livello globale.

Le build Unity vengono distribuite tramite Android App Bundle. Per informazioni, consulta la Guida: pubblicazione su Google Play di Unity, che descrive anche le modifiche dai file APK al formato AAB.

Monitoraggio e tracciamento

Durante la fase di live ops e distribuzione del gioco, puoi utilizzare Android Vitals per monitorare i problemi di prestazioni sui dispositivi a cui potresti non aver avuto accesso durante lo sviluppo e i test. Per maggiori dettagli, guarda Novità per i giochi in Raggiungimento e dispositivi e Android vitals.

Spesso i team di sviluppo più grandi dispongono di pipeline di telemetria di gioco uniche e personalizzate che forniscono metriche relative alle prestazioni del dispositivo. Ricorda di sfruttare Android Performance Tuner (APT) e il plug-in Unity corrispondente per perfezionare le metriche relative a frequenza frame, fedeltà grafica, tempo di caricamento e abbandono durante il caricamento. Segui la guida passo passo in Integrazione di Android Performance Tuner nel tuo gioco Unity.

Il ciclo di vita del tuo gioco non si interrompe dopo la pubblicazione. Il monitoraggio, la manutenzione e la risposta a prestazioni e feedback sono fondamentali per utenti soddisfatti, recensioni positive e l'adozione definitiva del tuo gioco in tutti i mercati.