You are on page 1of 46
ESPERTO IN UN CLICK Francesco Splendore Realizza il tuo videogioco a3 D eae Impareral: Mi telat ciate: (lle 1) Pita ence ea Cet a ol laa una texture NormalMap @ ad applicare una mappatura UV @ ad aggiungere e gestire la gravita nei modelli gD In questa nuova lezione affronteremo PABC della creazione di un mappa con Paggiunta di nuovi modelli 3D. Passeremo poi ad abbellire questi ultimi con texture ed effetti grafici. Affronteremo, in ultimo, 'aggiunta di gravita e ci soffermeremo sulla fisica degli elementi 3D. L’aggiunta di nuovi modelli 3D Non possiamo pensare di creare un gioco senza aggiungerci un nostro modello oppure utilizzare quelli messi a disposizione da Unity. Attenzione perd, tra poco non impareremo a creare dei modelli 3D da zero (visto che non é un argomento trattato in questa collana di ebook) ma solamente a inserire e modificare oggetti gia creati precedentemente da voio da altri. Nel caso in cui non abbiate esperienza con la modellazione 3D, vi consiglio di seguire i numerosi tutorial su YouTube oppure, se cercate qualcosa di pit professionale, seguire la collana di ebook di Areag1 Publishing su Blender scritta da Francesco Andresciani (Corso di Blender - Grafica zzare modelli 3D LOW-POLY! E molto importante uti Cosa intendiamo con questo? Ogni singolo modello 3D & composto da poligoni, In un motore grafico c’é un limite relativo al numero prestabilito di poligoni che devono comporre i singoli modelli 3D; di solito il limite @ 3000 poligoni per oggetto, ma in altri casi il limite pud essere inferiore. I] mio consiglio @ non superare mai i 1200 poligoni a modello 3D. Cosa accade se un modello ha molti pia poligoni? Se un modello ha molti poligoni (HIGH-POLY) si verificheranno dei cali di framerate e di conseguenza il gioco iniziara ad andare a scatti, abbassandosi al di sotto di 30 FPS (Frame Per Seconds). High-poly e low-poly Vediamo alcuni esempi di modelli con low-poly e con high-poly Low-Poly model (fonte immagine: Google) Low-Poly model (fonte immagine: Google) High-Poly model (fonte immagine: Google) Attenzione: Unity 3D @ in grado di leggere i seguenti formati file: .FBX, .dae, .3DS, .dxf, obj. Le texture sono la parte grafica dei modelli 3D. Un modello senza texture @ paragonabile a un disegno senza colori, Vediamo un esempio di modello senza texture (si trata del cubo standard di Unity) completamente Dianco. Quello che segue @ il medesimo cubo con la texture di una roccia, possiamo subito notare una grandissima differenza di qualita e grafica Esistono vari tipi di texture, come ad esempio la NormalMap, Bumped Diffuse, Bumped Specular, ete. Infine ¢’8 la fisica. Tramite la fisica aggiungiamo la gravité ad un qualsiasi oggetto 3D; inizialmente appena importato non avr& una fisica, poiché restera immobile nella posizione in cui lo collocheremo allinterno dell’editor. Medesimo cubo senza gravita, immobile nell'aria: Un oggetto con gravit’, invece, assumera ogni aspetto e comportamento di un corpo solido, ad esempio: se Voggetto sara sospeso nelaria, all avvio del gioco esso cadra a terra; se un oggetto a forma sferica si troverd su una discesa, esso iniziera a roteare fino a fermarsi su un piano solido. iamo con Paprire il nostro progetto, opuure crejamone uno nuovo. Successivamente, nelle cartelle del progetto, creiamo una nuova cartella. Create > Folder Show in Explorer — Open C2 Script pace Boo Script Import New Asset. Shader Import Package Compute Shader Export Package. Bra Find References In Scene ee, Select Dependencies aie Refresh CtrleR Cubemap Reimport Lens Flare Reimport ll Custom Font Render Texture Sync MonoDevelop Project Physic Matefal rene eee 5 Modelli 30 In questa cartella metteremo tutti i nostri modelli 3D, @ molto importante ordinare e nominare i file per evitare confusione. Prendiamo i nostri modelli 3D e trasciniamoli all'interno della cartella appena creata. Attenzione: una volta importati gli oggetti 3D @ possibile che in automatico si crei una nuova cartella chiamata “Materials”, lasciatela li, non eliminatela in alcun modo o potreste compromettere V'integrita degli stessi modelli. een eer) Otteniamo simultaneamente una piccola anteprima dei nostri modelli e, sul fianco, compare una freccia. KE: cimostrera i singoli componenti di quanto abbiamo importato. PIreeD Attenzione: é importante non eliminare nulla all'interno del modello, altrimenti verra compromesso e sara inutilizzabile! Ora inseriamo uno dei modelli all'interno del nostro gioco, quindi selezioniamolo e trasciniamolo nell’editor. Importando Yoggetto, possiamo notare che sara certamente pitt grande di quanto ci aspettassimo anche se lo abbiamo precedentemente ereato in scala, quindi ridimensioniamolo. Con Yimportazione dei modell, non sempre Unity procede all'inclusione dei rispettivi “Collider”, di conseguenza, se provassimo a scontrarci con cid che abbiamo importato, lo attraverseremmo come fosse immateriale. Per attivare i “Collider” dobbiamo recarci su Add Component > Physics > Box Collider. ene cen ees oo Peron eT Cee Cee SlKelurs aes cre ees Box Collider phere Collider Capsule Collider Mesh Collider fees Serer reer tetany kinned Cloth Sern Ce Peed Eee PCr reece In automatico Unity esaminera e traccera la collisione per tutta Yarea del modello 3D. E arrivato il momento di un muro, ‘ociare una semplice Texture 2D al nostro modello, in questo caso ricorreremo a Creiamo la cartella texture e, con il solito drag and drop, trasciniamo la texture nella cartella. In questo caso io utilizzerd la seguente textur: Trasciniamola sul nostro modello 3D: Scorrendo in basso sull'Inspector, dopo linserimento della texture, comparira una nuova sezione chiamata con il nome della texture stessa (nel mio caso “texture_semplice”). ee ee Pm ceo pea ary A ° Roe ee ee cory Serrano search Nello Shader verra segnato il tipo della texture, in questo caso Diffuse, che sta a indicare una texture semplice e lineare. Tramite il Main Color (di default bianco) possiamo modificare il colore della texture cosi da dargli delle colorazioni specifiche. PRO TIPS: per tornare alla tonalita nativa della texture dobbiamo inserire, tramite l'apposita finestra, ilcolore bianco. Scorrendo ancora verso il basso troviamo due controlli: Tiling e Offset. * Con Tiling possiamo “dividere” la texture sui due assi del modello (x,y). * Con Offset possiamo indicare lo “spostamento” della texture lungo gli assi. Agendo, ad esempio, sulla voce Tiling possiamo vedere il cambiamento della nostra texture sul piano/muro. Mettiamo come valore della x:2 e come valore della y:1, ecco il risultato: Notiamo che la texture & stata divisa verticalmente per produrre due texture simili nello stesso modello 3D. Ora cambiamo i valori attribuendo alla X: 2 € Y:2. Questa volta la texture @ stata divisa sia sull'asse orizzontale che verticale, formando quattro texture identiche tra di loro. Attribuendo il valore “o” ad uno dei due assi (x o y) otterremo il seguente risultato: Se metteremo o alla X la texture apparira con molteplici righe orizzontali. Mettendo il valore “o” alla Y si otterra il medesimo risultato ma con le righe in verticale. La NormalMap é una texture con un filtro (o mappatura) particolare che rendera il modello pit ri Si tratta di una texture a tutti gli effetti ma non pud essere utilizzata autonomamente, infatti necessita di una “base” d’appoggio. La base d’appoggio & la medesima texture senza il filtro “NormalMap”. Abbiamo quindi bisogno di una semplice texture che faccia da base e in pii la stessa texture in formato NormalMap. Per la realizzazione della NormalMap abbiamo bisogno di un programma di grafica; con programma di grafica intendo i software professionali come, ad esempio, Photoshop 0 GIMP e non utility base come Paint. Nel caso in cui non possediate un programma a pagamento come Photoshop, vi consiglio di utilizzare GIMP che & gratuito e ugualmente efficiente (scaricabile dal seguente link: http://www.gimp.org/downloads/). In versione base GIMP non pud realizzare le NormalMap, quindi abbiamo bisogno di un plugin scaricabile a questo indirizzo: http://registry.gimp.org/node/69. Arrivati sulla pagina di download, sclezioniamo il file “gimp-normalmap-wing2-1.2.1.zip” ¢ verra avviato automaticamente il download dell'archivio zip. normaimap This i a plugin for GIMP versien 2.0 and above. Itallows you to convert images into RGB normal maps for use in per-picel The goat Fohting 2 ‘© completely cone NVIDIA's phetoshop plugin, with 3 few new use can be found ont Home page: httpi/code.googie.com/p/simp-normaimao/ Attachment Sie 286.96K Una volta scaricato il pacchetto, dobbiamo dirigerci nella cartella dei plugin di GIMP, che, di default, sitrova in C:|Program Files\GIMP 2\lib\gimp\2.0\ plug-ins. Apriamo Parchivio zip (con programmi di archiviazione come, ad esempio, 7-zip 0 winRAR) e trasciniamo i plugin nella cartella di GIMP. SAP Ah @ ®@ Bionic s [EB sinpermameyinkP 219 cho DP mewiere emcees : Precermdonsene oe Broceretdoe re entee city B omeaioe Se avete fatto il procedimento correttamente, il plugin della NormalMap é stato finalmente installato, non resta che scegliere a quale texture applicare il filtro. L’immagine di cui creeremo la NormalMap per farne una texture sara la seguente: %, 11 nostro obiettivo @ farne un bellissimo quadro realistico, quindi apriamo GIMP e all’interno trasciniamo la nostra immagine. Per usare il nostro plugin dobbiamo seguire il percorso Filtri > Mappa > Normalmap. caer B Fi-moste Futime Maiusce Cuter ‘B Reimposa tut fits Sfecature Migioramente Distorsiont ‘Luce e ombra Disturbo Ritevemento contorni Gevesich Combinuzone Artistic Decoratia Meppe Bender Wee Anmazione Foal si cana. susione. Mappa a shale. Alf logotipe , Pythonfa Scrpt-Fu Nella finestra che si apre possiamo vedere, sulla sinistra, un’anteprima della normalmap attraverso il filtro “4 sample”. Minimum Z: Seale: (5) Swap RGB Height source: | Average RGD Alpha channel: | Unchanged Conversion: | None DU/DV mep: | None Contrast: 0.00000 PRO TIPS: il filtro 4 sample 8 troppo leggero per cid che vogliamo realizzare, il mio suggerimento é di utilizar sempre il filtro “Sobel 3x3”. Una volta scelto i filtro, clicchiamo sul tasto “OK” per applicarlo alla nostra immagine. Height source: | Average RGB Alpha channel: | Uncherged = Conversion: | None 5 30 Preview DU/DY map: None Alpha map: Contrast: 0,00000 Empty) x Ora non ci resta che salvare il lavoro, andiamo fu File > Esporta. File Modifica Seleziona Vi 1 Nucva.. Gree > Apr. ceo (® Apricome liveli Ctrie AlteO. @ Aonpoxine. Aprirecenti > @ Sana tries Salva come... Maiuse+Ctri+S Salva una copia. Bi Bicarice Attenzione: quando esportate limmagine ricordatevi di non sovrascriverla allimmagine base! Allinterno del nostro gioco importiamo adesso un modello 3D (in questo esempio si trattera di un quadro) e associamo la texture (come spiegato precedentemente). & | - = be re - & ay EIEN F _ | Abbiamo inserito la texture e nell’Inspector dobbiamo effettuare una modifica: i Nella finestra della texture (anch’essa vista precedentemente) dobbiamo modificare lo Shader prima di aggiungere il filtro del NormalMap. Clicchiamo quindi su “Diffuse” e selezioniamo “Bumped Diffuse”. Peer Diffuse Detail CEMA §— Parallax Diffuse TEE Parallax Specular hade Specular Main Color Vertelit peat a uD sul Mobile Nature Particles Reflective Ora sara apparsa una nuova voce chiamata, appunto, Normalmap. Clicchiamo su “Select” e selezioniamo il nostro filtro. eer Tee cee Pee =e oa Sere acre eiee Textur eer e Tornando a visualizzare il nostro modello con texture, possiamo notare che ci saranno problemi con la visualizzazione della nostra texture, difatti apparira offuscata. Per risolvere questo inconveniente dobbiamo tornare nell’ Inspector e cliccare sul tasto “Fix Now”. = Ta wees PP PLL E! ‘Senza NormalMap L'ultimo Shader che analizzeremo in questa lezione sara il Bumped Specular. Tramite questo shader manterremo la NormalMap e in pitt aggiungeremo un colore per rendere speculare la texture, vediamo subito con un esempio. Innanzitutto attiviamo lo shader e inseriamo il “Bumped Specular”. Bumped Diffuse ¥ Bumped Specular Decal Diffuse Diffuse Detail Parallax Diffuse ParallaxSpecular Specular Vetedit Vediamo che sono state aggiunte due nuove voci, ovvero “Specular Color” e “Shininess”, @ quadrot eee pee hinine: Percy) arr) r Pere cr) r ‘Tramite il Main Color possiamo aggiungere un colore alla nostra texture, invece, con Specular Color, ne aggiungiamo un secondo per creare un effetto speculare alla nostra immagine. Al Main Color mettiamo, ad esempio, i] rosso e su Specular Color selezioniamo il bianco. hs @ NI Te nha es FL ne a em =e Notiamo subito che il colore base della texture @ divenuto il rosso, peré, in presenza di luce, @ possibile notare un’ombreggiatura o un riflesso del colore bianco, che abbiamo inserito precedentemente. Ora riproviamo invertendo i colori: i Z : 1 Leffetto si nota anche se la combinazione dei colori bianco-rosso va in conflitto e non & visibile come nel precedente esperimento rosso-bianco. Sta solamente alla vostra immaginazione sperimentare nuove combinazioni di colori per abbellire i dettagli delle Texture! Infine, troviamo la barra dell opzione “Shininess”: Tramite questopzione possiamo modificare YintensitA del colore speculare. Spostando Tindicatore a destra Vintensita sara minore, mentre a sinistra aumentera. PNIVOE eae eas hes MS . hema Intensita colore massima Prima di terminare il discorso sulle Texture dobbiamo parlare della Mappatura UV. Nei casi precedenti prendevamo una texture uniforme e la trascinavamo sul modello 3D da riempire, questo procedimento funziona solamente per i modelli pia! semplici (es. cubi, piani, sfere), ovvero tutti quei modelli che avranno una texture uniforme e uguale per ogni lato (o faccia) del modello. Se vogliamo avere qualcosa di molto pit complesso, come ad esempio un modello che abbia delle caratteristiche differenti e non uniformi, avremo bisogno dell'UV Mapping. E possibile effettuare questo tipo di mappatura solamente tramite software di grafica (es. Blender, Cinema 4D, ete. Non essendo oggetto di questo corso, per ogni dubbio oppure per comprendere questo procedimento di elaborazione grafica, vi consiglio di consultare questa pagina web: hi . Scelto il modello da mappare (in questo caso un elevatore), passiamo a realizzare Ja texture UV e importiamola su Unity. /-www,michel Notiamo che una volta importato il modello esso apparira bianco. Se applicassimo una texture semplice, come ad esempio quella del muro, apparirebbero diversi glitch grafici come nell’immagine seguente: Prendiamo quindi la nostra texture UV e trasciniamola nel modello; otterremo ques xture UV utilizzata é la s Vedremo adesso come aggiungere la gravita nei nostri modelli 3D. La gravita non dipende dal livello (0 mondo) del gioco, bensi da ogni singolo modelo, quindi dovremo ripetere la stessa operazione piti e piit volte seguendo il numero dei modelli soggetti a gravita. Scegliamo un modello qualunque a cui attribuire la gravita, in questo caso scegliamo nuovamente il nostro elevatore. Come primo passo dobbiamo inserire una collissione, altrimenti entreremo dentro al nostro modello, quindi, come spiegato in precedenza, selezioniamo tutto il modelo tramite la gerarc Clicchiamo su Add Component > Physics > Box Collider. onenens con Gite Gnas Perce audio Rendering ieee net eet fue cg Pree) Rare og eee Sere eo Mesh Collider reeieelery Terrain Collider eee etens @ Skinned Cloth Cec or Sees Fixed Joint Cereus Facciamo un esperimento: tramite l'editor prendiamo il] nostro modello e trasciniamolo in aria, in modo tale che rilasciandolo dovrebbe ricadere sulla superficie. Come vediamo dall’immagine e dal vivo tramite Unity, il modello resta sospeso in aria, quindi selezioniamo di nuovo il modello 3D e seguiamo il percorso Add Component > Physics > RigidBody. Coen cen Pie Cee fee EE Cee ella eee New Script Earnest ees i fox Colder Hired Ree ot Teh Nesh Colder eee ee respect Cae Ret C Serco eee preeeres ESE Nesu ues Ora nell inspector sara comparso un nuovo componente (chiamato appunto RigidBody, ovvero Corpo rigido) con varie impostazioni: Creer ore Drag OEE) Cord ere parce} Coenen Ses * Con Mass potremo, appunto, modificare la massa (espressa in unita arbitrarie) del modello. & consigliabile non inserire valori superiori a 100 rispetto ad altri RigidBody. * Con Drag modifichiamo la resistenza della collisione del nostro modello. Inserendo “o” il modello non verra spostato da nulla, con un numero superiore a “1000” sara possibile spostare loggetto con qualunque cosa. Attenzione: con “spostamento del modello” intendiamo che se qualeosa (il player o un altro modello) collide il modello sottoesame, quest’ultimo sara spostato pid lontano rispetto alla posizione inizial Possiamo prendere come esempio il gioco delle biglie [guarda in seguito]. * Con Angular Drag modifichiamo la resistenza di rotazione quando il modello verra colpito. * Con Use Gravity, se abilitato, il modello sara affetto da gravita. * Con Use Kinematic, se abilitato, il modello non sara controllato dal motore fisico e potra essere manipolato (0 controllato) solamente attraverso il suo ‘T'rasform. In poche parole, attraverso 'opzione Kinematic potremo animare il modello solamente attraverso animazioni e script. * Con Interpolate possiamo intervenire se ci sono “scatti” o problemi con I'animazione del nostro modello, le varie opzioni sono: © “None”, non verra applicata aleuna Interpolazione; © “Interpolate Trasform”, !animazione verra effettuata alla base del fotogramma precedente; © “Extrapolate Trasform”, l'animazione verra effettuata con una approssimazione del fotogramma precedente. ¥) None Interpolate Eitrapolate * Con Collision Detector possiamo prevenire che un oggetto attraversi a velocita elevata un altro oggetto senza rilevare collisioni. Possiamo intervenire con le seguenti opzioni: © con “Discrete” (valore standard) si rileveranno le collisioni di tutte le forze in moto; © con “Continuous” si rileveranno le collisioni di collider dinamici e saranno anche rilevati le collisioni contro i MeshColliders statici; © con “Continuous Dynamic” si rileveranno in modo continuo le collisioni di modelli in rapido movimento. VY Discrete Continuous Continuous Dynamic * Con Constraints possiamo inserire delle restrizioni al movimento del modello. 1. Con “Freeze Position” il modello sar bloccato e non potra muoversi sull'asse selezionato. 2. Con “Freeze Rotation” il modello sara bloccato nel ruotare sull’asse selezionato. rn eee eee Ora che abbiamo inserito la fisica proviamo a entrare nel gioco premendo “Play” e vediamo cosa accade. [VIDEO La fisica presente nel gioco potra sembrare molto semplice, quindi procediamo con un altro esempio. Creiamo un piano (GameObject > Create Other > Plane) e allestremita inseriamo una sfera (GameObject > Create Other > Sphere), vediamo come reagisce alla gravita. Component Terrain Window Help Create Other » Particle System Center On Children Camere GUI Tet Make Parent a. Clear Parent ali Apply Changes To Prefab Directional Light Point Light Spotlight Area Light Break Prefab Instance Move Te View Cele alte F Align With View Chris Shits F Align View to Selected Cube Sphere Capsule Cylinder Plane GemeObject] Component. Tein Window Help Greate Empty chit Create Other >| Paice Sytem | camera | | Center On Children GuIText Make Parent GUI Texture Clear Parent 3D Tet Apply Changes To Prefab Break Prefab Instance peacene art Point Light Move To View Cele alte F Spotlight Align With View trie Shit+F rea light Align View to Selected Cube Sphere | Alla fine della corsa posizioniamo una seconda sfera. Attenzione: ricordati sempre di inserire la proprietd RigidBody. [VIDEO sibil ‘Tramite aleuni aggiornamentié p 3D. Naturalmente queste animazioni non potranno essere paragonate a quelle realizzate attraverso tool specifici (ad esempio Cinema 4D, Blender, Maya, ete.) Per completezza ci occuperemo comunque delle animazioni in Unity. Inseriamo nella scena un modello a cui vogliamo dare una qualsiasi animazione (un eubo, in questo esempio). creare delle semplici animazioni anche attraverso il motore di Unity Successivamente, tramite VInspector, seguiamo il percorso Add Component > Miscellaneous > Animator. one Navigation re oar) ee EEE Resa eueas Pree neers au | Orc eee ie Successivamente andiamo su Window > Animation. Help Newt Window Cte Tae Previous Window Ctrl-Shift+Tao Layouts » Scene Ctrlet Game trie Inspector Curle3 Hierarchy Cries Project Ctrlss Animation Chris Ora si aprird una nuova finestra di Unity. Cre Tramite questa finestra creeremo T'animazione per il nostro modelo. Innanzitutto cliechiamo (tramite Yeditor) sul modello a cui vogliamo associare un'animazione (in questo caso sempre il cubo). Una volta selezionato il modello, aiutandoci con la combinazione dei tasti CTRL + tasto s selezioniamo tutte le voci del Trasform: inistro del mouse, Cnn i ome cenen Ceres) Bex Collider Cece na @ Default-Ditfuse (Material Clicchiamo sul tasto “REC”. Ci verra chiesto di dare un nome alla nostra animazione e di selezionare la cartella di destinazione. enti > progetto unity > Assets > Cerca Assets cartels + Nome . Uttima modifica i Modelii30 9/10/2013 14:21 {Di skyborsuntsdeg 04/09/2013 19:30 Wi Standard Assets 24/09/2013 1542 © di suoni 13/07/2013 14:12 ya animaziondanim n Canim) Una volta scelto il nome, cliechiamo su “Salva”. Ora clicchiamo sul tasto “Add Key frame” per inserire il primo frame dell'animazione. Sulla Timeline a destra possiamo notare dei numeri. I numeri stanno a significare i secondi; ad esempio 0:30 rappresenta mezzo secondo, 1:30 un secondo e 3 decimi di secondo. itta dove verranno salvati i Cliechiamo ad esempio su un secondo (la linea rossa rappresenta la posizione keyframe dell’animazione) e tramite I'editor spostiamo il modello 3D. Dopo averlo spostato clicchiamo di nuovo sul tasto dei Keyframe. Ora possiamo cliccare sul tasto “REC” per fermare la registrazione dell’animazione e cliccare su “Play” per verificare se tutto funziona correttamente. Nel caso in cui incontriate difficolta, ecco un breve video per riassumere cié che abbiamo trattato fino ad ora. [VIDEO Ora che abbiamo creato la nostra animazione possiamo chiudere la finestra della Timeline. Tra i file del progetto appare anche il file della nostra nuova animazione. oreo Prendiamo l’animazione e trasciniamola all'interno del nostro modello. coun ee) Ni Pan 7 ene ee Cee een Caan Ces Ee Cee tn aeecs L’animazione verra effettuata solamente una volta, quindi, per farla partire in un determinato momento, dobbiamo manovrarla attraverso la programmazione e script (che vedremo nei prossimi ebook). Quello che segue @ un video in cui é mostrato il procedimento per creare un’animazione pitt comples [VIDEO] Durante la pratica di quanto appreso potrebbero presentarsi problemi o difficolta di lieve entita. Per tutti gli utenti che hanno acquistato ebook é quindi messo a disposizione un supporto tramite email. Al'indirizzo email ebookunity3D.supporto@hotmail.it potrete richiedere un qualsiasi aiuto o far pervenire suggerimenti, proposte etc. Inviate solo ed esclusivamente una email, il supporto impieghera 24-48 ore per rispondere. I supporto va utilizzato in maniera adeguata, esclusivamente per le lezioni apprese negli ebook, per qualsiasi altro argomento non trattato l’email sara ignorata. Francesco Splendore @ nato a Chieti il 14 ottobre 1995. Fin da subito ha imparato a utilizzare il computer e a scoprirne tutti i segreti. E un appassionato di computer, tecnologia, anime giapponesi e di videogiochi. Il suo interesse per i videogiochi I'ha presto portato a studiare la programmazione con Yobiettivo di sviluppare games accattivanti e coinvolgenti.

You might also like