Con Unity 3D è un gioco – Parte 2

Unity-5In questa seconda puntata della serie dedicata ad Unity 3D, apriamo con una notizia molto importante: nella recente Game Developer Conference tenutasi due settimane fa, è stato ufficialmente presentato Unity 5. Questa nuova versione del motore, segna un passo molto importante perché finalmente si spinge molto di più sul piano della qualità visiva, con quella che pare una particolare attenzione per le console di ultima generazione. Insomma il prodotto dimostra di essere maturato molto, e sono sicuro che in futuro potremo vedere qualche titolo AAA sviluppato con questa quinta generazione. La guerra al motore grafico “free” sta diventando sempre più accesa, anche in seguito ai due recentissimi annunci di Valve e Epic Games (anch’essi fatti durante la GDC), i quali hanno annunciato che i loro pesi massimi, rispettivamente il Source 2 e l’Unreal Engine 4, sarebbe stati distribuiti gratuitamente con modalità di licenze simili a quelle di Unity: il futuro per noi sviluppatori di giochi è roseo, perché possiamo finalmente dare vita alle nostre creazioni con le migliori tecnologie disponibili sul mercato.

Nella scorsa puntata ci siamo lasciati dopo aver fatto una panoramica sul come sono organizzati i progetti, e sul come lo sviluppo di un gioco richieda diverse abilità e prerequisiti per essere portato avanti nel modo corretto. Sperando di aver acceso in voi la voglia di creare e dar vita ai vostri giochi, continuiamo seguendo ancora la storia dello sviluppo di Spacejunk per addentrarci in qualche dettaglio più succoso dell’universo Unity 3D.

Dietro ogni sequenza di frame che si susseguono sul nostro schermo e che compongono un gioco, sia che si tratti dell’essenziale Pong o del capolavoro della tecnica visiva The Order 1886, c’è una “intelligenza” che regola ad arte tutto il mondo virtuale, un po’ come fossero le regole della fisica che danno origine alla nostra realtà.

Nell’universo di Unity, queste regole si definiscono utilizzando gli script. Essi, scritti generalmente in linguaggio C# ma volendo anche in JS, sono delle porzioni di codice che vengono “iniettate” nel sistema e sono eseguite generalmente ad ogni frame (ma anche no, questo dipende dall’oggetto al quale sono collegati e dalle vostre scelte), permettono di definire le regole di comportamento di uno o più entità. Se non avete familiarità con la programmazione, forse sarà più difficile visualizzare cos’è e cosa fa uno script, diversamente saprete già di cosa parlo: facciamo un esempio pratico così da permettere a tutti di comprendere la facilità con il quale è possibile dar vita ad un gioco con Unity.

Spacejunk, il gioco per Android che ho sviluppato, prevede tra le varie regole di gameplay la seguente: quando un “Rodon” (nome dell’entità sparata dalla navicella del giocatore) colpisce la griglia di gioco, esso ne trasferisce la propria energia che si tramuta, visivamente, in un cambio di colore della cella colpita. Per far questo è necessario creare uno script da “attaccare” a ciascuna cella della griglia, e fare “qualcosa” quando il motore fisico di Unity (di cui parleremo più nel dettaglio in seguito) ci avvisa che è avvenuta una collisione tra un Rodon e la griglia: di seguito un estratto dallo script.

 

Questo metodo viene richiamato automaticamente da Unity quando qualche entità collide con la cella della griglia
void OnCollisionEnter(Collision collision)
{
    Verifico che l’oggetto con il quale ho colliso sia effettivamente un Rodon
    RodonCell _rodon = collision.gameObject.GetComponent<RodonCell>();
    if (_rodon != null)
    {
        …………..

        ++m_TouchCount;

        Spacejunk.RODON_TYPE _rodonType = _rodon.GetType();
        Spacejunk.COLOR _rodonColor = _rodon.GetColor();

        if(m_TouchCount <= Planet.CELL_TOUCH_COUNT)
        {
           if(_rodonType != Spacejunk.RODON_TYPE.X)
               m_Color = _rodonColor;

           Cambio il colore della cella settandolo come quello del rodon che mi ha colpito
           renderer.material.color = Spacejunk.GetColorRGB(m_Color) / m_ColorDivider[Planet.CELL_TOUCH_COUNT – m_TouchCount];

           m_SourceColor = renderer.material.color;
        }
        …………..
    }
}

Da questo semplice pezzo di codice, è possibile fin da subito percepire la potenza di Unity: tutta la parte difficile e matematicamente complessa, ossia la rilevazione della collisione tra oggetti 3D che si muovono in uno spazio virtuale, così come le regole che definiscono l’aspetto visivo delle entità presentate a video, sono del tutto trasparenti allo sviluppatore.

Non ho dovuto scrivere nessun algoritmo per rilevare collisioni, ma ho solo dovuto concentrarmi (risparmiando tempo ed ottenendo un risultato migliore) solamente sulla parte di gameplay, ossia del cosa succede mentre il gioco viene eseguito in risposta a determinati eventi. Questo è quello di cui avete bisogno se volete realizzare un gioco, ossia la possibilità di dedicare il 100% delle vostre energie e risorse alla sola creazione dell’esperienza utente. Spacejunk è composto da più di 100 differenti script (senza contare quelli di sistema e dei plugin esterni), ognuno dei quali regola un diverso aspetto di gioco, la somma dei quali dà vita ad un mondo 3D fatto di asteroidi e navicelle!

Vediamo ora un altro aspetto molto importante, ossia la simulazione fisica delle scene, di cui per ora abbiamo fatto solo alcuni accenni. Indipendentemente dal fatto che il gioco che avete in mente sia 2D o 3D, semplice o complesso, statico o dinamico è sempre necessario attribuire alle varie entità un’esistenza “fisica” nel mondo di gioco. Unity è provvisto di una serie completa di strumenti per creare simulazioni spettacolari, e fa uso del famoso Box2D quando si tratta di una rappresentazione bidimensionale piuttosto che del potente PhysX di Nvidia quando invece bisogna fare sul serio con un mondo tridimensionale. Si tratta di due prodotti eccezionali sia dal punto di vista delle performance che da quello della qualità della simulazione, e grazie a Unity la loro semplicità d’uso migliora ulteriormente guadagnando un alto livello di astrazione.

Vi basterà selezionare, dall’editor visuale, un qualsiasi oggetto e definire ogni sua proprietà fondamentale: statico o dinamico, soggetto o no alla gravità, massa, frizione, vincoli, materiale… tutto quello che volete con pochi click. Premete il tasto Play e vedrete i vostri oggetti cadere al suolo attratti dalla gravità, toccare terra ed interagire tra loro come nel mondo reale: è davvero fantastico come ciò sia possibile in pochissimo tempo e con nessuna conoscenza di programmazione, tutto è realizzabile dall’editor usando solamente il vostro mouse.

Figura 1 - Potenzialità del motore fisico
Figura 1 – Potenzialità del motore fisico

Ovviamente, il motore fisico non è adatto solamente a simulare il comportamento di oggetti rigidi, ma è così potente da permettervi, con quasi la stessa facilità, di creare complesse simulazioni per gestire i tessuti, i fluidi, i gas e più in generale tutto quello che concerne l’uso di particelle (effetti speciali di vario genere, come le esplosioni, il fuoco od il fumo sono realizzabili con queste tecniche). In Spacejunk, il motore PhysX è stato fondamentale per creare le regole di gioco che mi ero prefissato, in quanto grazie ad esso ho potuto simulare con semplicità la navicella che spara, i Rodon che colpiscono la griglia, le esplosioni, gli asteroidi… c’è un po’ di “fisica” praticamente in ogni singolo aspetto di gioco.

Discorso a parte meritano invece le opzioni di scalabilità e multipiattaforma, altro vero cavallo di battaglia di Unity. Finora infatti non abbiamo mai parlato di piattaforme sulle quali il nostro gioco potrà girare, in quanto virtualmente esso potrà essere distribuito tanto su uno smartphone del 2010 quanto su di una fiammante Playstation 4: è questa la magia del “Cross-Compiler”. Qualsiasi sia il gioco che voi avete in mente, di sicuro avrete anche pensato alla piattaforma sul quale poi verrà fruito: meglio il PC o la console? Meglio Android o iOS?

Iniziamo con lo sfatare subito un mito: non è vero (e sarà ancor più evidente quando parleremo dei plugin) che è solo questione di fare un click qui ed uno là per pubblicare un gioco su una delle 21 piattaforme supportate. Le cose sono un po’ più complicate, anche se dal punto di vista di Unity è davvero semplice: basta mettere un segno di spunta sulla piattaforma preferita ed otterrete un file compilato che contiene tutto il gioco, senza ulteriori sforzi. Ma allora dove sta l’inghippo?

Risiede nel fatto che è il vostro gioco a non essere adatto a tutte le piattaforme, quindi dovete in fase di design fare delle scelte oculate: un gioco per smartphone normalmente non è adatto ad una console, e non è una questione di potenza grafica: a quella come detto ci pensa Unity, che vi offre diversi strumenti per gestire la scalabilità delle texture, dei modelli 3D, degli effetti grafici e di illuminazione in modo che possiate avere risultati eccellenti, soprattutto dal punto di vista delle performance visive, a seconda della piattaforma sulla quale state facendo il “deploy”.

Dovete progettare accuratamente, ad esempio, lo schema dei controlli, in quanto su smartphone disponete di uno schermo touch, su console di un controller e su PC di mouse e tastiera. Dovete fare delle scelte intelligenti, e lasciarvi la strada aperta a tutte le soluzioni, e non contaminare il gameplay con i sistemi di interazione forniti all’utente (attenzione perché è molto facile lasciarsi ingannare). Io ad esempio, benché Spacejunk sia per ora disponibile solo su Android (aprirò ad altre piattaforme in futuro), ho fatto delle scelte molto precise e ponderate in modo tale che il gioco possa essere fruibile, un domani, anche con il controller e non solo con il touch screen.

Ma non è solo una questione di input, dovete anche valutare l’hardware che avete a disposizione: d’accordo che la scalabilità delle pipeline di rendering è molto avanzata, ma Unity da solo non potrebbe di certo “comprimere” un gioco come il prossimo venturo Bloodborne per PS4 e farlo girare su un dispositivo mobile da 4”. Quindi in fase di progettazione, pensate bene a dove volete rendere disponibile il gioco, perché averlo su tutte e 21 le piattaforme sarà impossibile, al di là degli “spot” promossi da Unity sul come questo sia facile (tecnicamente lo è, il problema ribadisco è tutt’al più nel design).

A rendere questo compito ancora più difficile poi, ci sono anche le specifiche implementazioni di “piattaforma”: già solo nel mondo mobile tra Android, iOS e Windows Phone ci sono difficoltà tecniche a rendere davvero compatibile al 100% tutti gli effetti grafici e gli script. A volte sarà necessario scrivere del codice apposito solo per una specifica piattaforma per ovviare a problemi di natura tecnica insormontabili, senza contare il mondo dei plugin esterni, anch’essi causa di frammentazione. Questo però non deve scoraggiarvi, è solo necessaria più attenzione in fase di progettazione, e sarà necessario scendere a compromessi scegliendo un sottoinsieme di quelle che ritenete le piattaforme più adatte (e remunerative per il vostro modello di business) tra le 21 disponibili.

Questa seconda puntata termina qui, nella prossima parleremo di plugin, di social network, di modelli di business, di come tracciare le abitudini di gioco degli utenti e molto altro ancora.

E voi state sviluppando qualcosa con Unity (o con un altro motore)? Avete qualche progetto in mente? Parlatemene nei commenti!

Se siete interessati a vedere dal vivo il progetto Unity oggetto di questa serie completo e funzionante, Spacejunk è disponibile al download per tutte le piattaforme Android a questo indirizzo:

https://play.google.com/store/apps/details?id=fax3d.games.spacejunk

 

Press ESC to close