Tip:
Highlight text to annotate it
X
Salve a tutti! Eccoci alla terza puntata sulle basi di Unity 3D. In questa puntata, parleremo dell'importazione di “assets”, ovvero – in generale – file utili per il nostro progetto.
Non si tratta solo di modelli 3D ma anche di textures, shaders, script o intere scene sviluppate con altri programmi; vedremo, inoltre, come importare “pacchetti”
di assets forniti di serie da Unity e scene da altri programmi, in particolare Blender 3D (ma quello che vedremo qui può essere esteso facilmente a 3D Studio MAX o altri software,
i concetti e le procedure non cambiano).
Questa puntata inizia, in realtà, con un file di scena di Blender 3D, all'interno del quale abbiamo due oggetti: una casetta e un ponticello.
Nota per chi non conosce o non sa usare Blender 3D: non vi preoccupate, qui il concetto non è “da Blender a Unity”, il punto è mostrare
come sia possibile importare Assets creati e modificati con programmi esterni in Unity; inoltre, non è detto che ciascuno DEBBA per forza saper usare tutti i programmi:
se ad esempio lavorate in team, ci saranno i modellatori che nemmeno si occuperanno delle Textures, che spetteranno invece ai grafici,
mentre voi metterete i prodotti finali nella scena, quindi non è necessario saper modellare mesh o creare delle Textures, vediamo solo come importare gli assets in Unity.
Il file della scena si chiama “ScenaBlender.blend”. Chiudiamo Blender e passiamo a Unity, con un progetto nuovo.
All'inizio di un nuovo progetto, lo scenario virtuale è particolarmente triste: sfondo blu uniforme (in fase di gioco, nella schermata Game),
inoltre l'unico oggetto presente, peraltro puramente virtuale, è la telecamera.
Approfittiamone per aggiungere, come anticipato nella scorsa puntata, un “pavimento” alla scena; in particolare, facciamo click su Terrain – Add Terrain, nel menù in alto.
L'oggetto, inserito sia nel Project che nella Gerarchia, sembra essere un semplicissimo piano, ma non fatevi trarre in inganno: un Terrain è un oggetto particolare di Unity,
messo a disposizione in maniera nativa per accelerare (mediante script che modificano aspetto visivo e geometrie dell'oggetto)
il processo di creazione di un ambiente davvero ricco di elementi.
In particolare, con tale oggetto selezionato diamo un'occhiata alla finestra Inspector: c'è uno Script, “Terrain Script”,
che nella maschera contiene delle icone che sembrano suggerirci... qualcosa alla quale vogliamo credere ma stentiamo a farlo perché ci sembra troppo bella per essere vera:
la possibilità di inserire al volo, con dei click, montagne, colline, valli, textures, alberi ed altri elementi!
Stentiamo a crederci, ma è la verità: clicchiamo sulla prima icona, “Raise / Lower” (alza/abbassa).
La finestra ora ci informa che un click alzerà il terreno, mentre un click ma tenendo premuto SHIFT lo abbasserà.
La forma dei pennelli (Brushes) serve a definire la forma delle modifiche, come un pennello in Photoshop o GIMP, mentre in Settings – Brush size possiamo definire
la grandezza del pennello (e, quindi, la dimensione delle modifiche, a ogni click) e in Opacity, in un certo senso, l'intensità.
Portiamo Opacity a 100 e iniziamo a creare dei rilievi cambiando a piacere forma e dimensioni del pennello, per prendere confidenza con lo strumento.
Sto andando a caso, quindi non stupitevi se il risultato sarà particolarmente... brutto!
Ok, il Terrain quindi è un ottimo punto di partenza per definire un ambiente virtuale in poco tempo, tuttavia in questo videotutorial ci fermiamo a rilievi e valli (e, tra poco, Textures),
prometto però che spiegherò come inserire alberi e altri elementi (qui detti “Details”, dettagli) in un tutorial ad hoc (come avrete intuito,
lo script Terrain è ricco di risorse, quindi meglio trattarlo a parte più in là).
Molto probabilmente l'oggetto Main Camera sarà ora in un punto poco interessante, quindi spostiamolo per definire meglio l'inquadratura
(visibile nell'anteprima in basso a destra nella finestra “Camera Preview” della scheda Scene).
Notiamo, comunque, che il cielo ha sempre quel colore che non ci piace, mentre lo scenario è grigio scuro.
Per risolvere il primo problema, con la telecamera selezionata, nell'Inspector cambiamo – a piacere – il colore nel campo Background...
è vero, senza Textures il cielo resta brutto, ma comunque meglio di prima, inoltre ora sappiamo dove si trova il colore dello sfondo: nella scheda della Telecamera virtuale.
Per quanto riguarda la mesh, importiamo il primo Asset esterno nella nostra scena... anzi, per la verità importiamo un intero pacchetto di assets,
come una cartella di file ma contenente, nel nostro caso, elementi di vario tipo.
Unity è un programma meraviglioso che fornisce, di serie anche nella versione gratuita, un'incredibile quantità di oggetti.
Clicchiamo sulla voce di menù Assets, in alto, scegliendo “Import Package”.
La prima voce, in questo sottomenù, è Custom Package, cioé un pacchetto personalizzato (perché, sì, è possibile creare e salvare pacchetti personalizzati
da rendere disponibili per altri utenti e altri progetti), comunque tutte le altre voci sono pacchetti di elementi e strumenti forniti dal programma
(alcuni di questi sono solo per la versione PRO, come indicano le voci “Pro Only”, ad esempio per Glass Refraction o Image Effects).
Scegliamo il pacchetto Terrain Assets e confermiamo l'importazione di tutti gli elementi nelle schermate che appariranno.
Al termine dell'import, in Project vedremo l'icona di una cartella e la voce “Standard Assets”, dentro la quale (con un doppio click)
troveremo “Terrain Assets” e, dentro, altri elementi.
Scegliamo, in particolare, “Terrain Textures”: il pacchetto ci mette a disposizione 4 Textures per il nostro terreno.
A questo punto la domanda è: come facciamo a dare, ad esempio, “Grass (Hill)” al nostro ambiente?
Selezioniamo l'oggetto Terrain, ma attenzione a selezionarlo questa volta in Gerarchia, non in Project,
visto che vogliamo modificare l'elemento presente nella scena corrente.
Nella sezione Terrain (Script), selezioniamo l'icona col pennello, “Paint the Terrain Texture”, quindi clicchiamo sul pulsante “Edit Textures” in basso.
Apparirà una nuova finestra dove potremo selezionare alcune Textures tra quelle presenti nel progetto.
All'avvio di un nuovo progetto, questa finestra in genere è vuota perché non ci sono Assets di tipo Textures, ma ora abbiamo le Textures importate nel progetto
mediante il Package Terrain Assets!
Scegliamo quindi Grass (Hill), lasciando le altre impostazioni come di default (potranno essere comunque modificate in seguito) e confermiamo.
La Texture verrà applicata, replicandola, su tutto il terreno, tuttavia guardando l'anteprima della vista Telecamera, o comunque nella scheda Game,
notiamo che il Terrain è nero! Non è cambiato molto, rispetto al grigio di prima!
Il motivo sta nell'illuminazione della scena: attualmente, non ci sono fonti di luce nella scena, né Textures HDR
(particolari textures “illuminanti”, per così dire) come sfondo dell'universo virtuale.
Aggiungere una fonte di luce è semplicissimo: dal menù Game Object, scegliamo Create Other e, da qui, Directional Light.
Le fonti di luce presenti sono 4 (notate i separatori nel sottomenù Create Other) e i loro utilizzi e le loro caratteristiche sono facilmente intuibili:
Point è una sorgente puntiforme omnidirezionale, con ombre e attenuazione, come una lampadina a bulbo; Spot è il classico faretto,
quindi con direzione, cono d'apertura, ombre e attenuazione; Area è una superficie emettitrice, come un pannello luminoso o un monitor;
Directional Light, quella che abbiamo scelto, è una luce che ha origine da distanza infinita e con superficie emettitrice illimitata, senza attenuazione,
quindi qui – ed è l'unico caso tra le 4 luci – non ha importanza la POSIZIONE dell'icona della luce nella scena,
ma solo il suo ORIENTAMENTO, perché sarà l'orientamento dei raggi luminosi.
Per tutte queste caratteristiche, Directional Light è ottima per l'illuminazione ambientale di uno scenario aperto, come il nostro.
Fate un po' di pratica con tale oggetto nella scena spostandolo e, soprattutto, ruotandolo, utilizzando sia le coordinate Global che Local...
ovviamente, potete fare anche delle prove con altre fonti di luce, inserendo oggetti Point Light, Spot Light o Area
e spostandoli o ruotandoli per valutarne caratteristiche ed effetti.
Come si può notare nella Camera Preview o nella finestra Game, lo scenario è ora illuminato.
A questo punto vi consiglio di fare un paio di minuti di pausa prima di proseguire con la seconda parte di questo videotutorial, d'altronde gli argomenti da ripassare ci sono:
creazione di un Terrain, import di un Package nativo di Assets, sfondo virtuale, fonti di luce e loro caratteristiche.
Ok, riprendiamo il videotutorial trattando l'inserimento di assets in arrivo da altri software.
Potrete pensare: vabbé, si fa Assets – Import new asset e si sceglie “ScenaBlender.blend”... beh, sì: è proprio quello che bisogna fare! Oppure...
possiamo fare come sto facendo a video: con la finestra “Esplora risorse” con la cartella con la scena .blend che voglio importare aperta, trascino il file in Project,
nella finestra di Unity: ecco creato un Prefab della scena di Blender!
Facendo click sul Prefab “ScenaBlender”, notiamo la presenza di due “Oggetti” (combinazione di geometria mesh E materiali, eventualmente con Textures)
e delle sole mesh, che sono le sole informazioni sulla geometria del modello, senza informazioni sull'aspetto, i materiali, eccetera.
Gli Oggetti hanno come icona il cubo con il foglio bianco, mentre le mesh hanno una specie di griglia 3D, a suggerire appunto
che si tratta di informazioni sulla geometria (vertici, spigoli e facce).
Trasciniamo “ScenaBlender” in un punto nella finestra Scene: ecco importati i due modelli presenti nel file “ScenaBlender.blend” all'interno del nostro scenario Unity!
Qui, possiamo traslare, ruotare e scalare a piacere questi oggetti.
I file .blend (ma il discorso vale, ad esempio, anche per i file delle scene 3ds di 3D Studio MAX o di altri programmi...
Unity ha una notevole compatibilità verso molti software, di vario tipo), dicevo questi file .blend possono essere usati come “librerie” di modelli 3D,
ad esempio potreste avere dei file .blend chiamati “divani”, altri chiamati “ponti”, “aerei”, eccetera, da utilizzare per importare i vari elementi nelle scene dei progetti.
Adesso, faccio doppio click sul Prefab “ScenaBlender” in Project, ed ecco che si apre Blender: Unity riconosce automaticamente il programma
associato ad un dato Asset, quindi facendo doppio click su un file PSD (perché, sì, potete trascinare qui anche i file di progetto di Photoshop, con tanto di livelli),
si aprirà Photoshop, e così via... ma la vera magia è un'altra.
Modifico il modello originale in Blender, salvo la scena, torno alla finestra di Unity e noto che Unity sta lavorando... e, dopo un po', la scena si aggiorna:
i modelli, inseriti poco fa come Prefabs, hanno ora la nuova geometria che ho appena modificato in Blender!
Blender è ancora aperto, è ancora “caldo”, ma è bastato salvare perché Unity, al volo, si rendesse conto
delle modifiche apportate alla scena e le applicasse al progetto corrente!
Neanche a dirlo, se lavorate in team (o anche da soli, meglio a questo punto con un doppio monitor), tutto ciò può accelerare tantissimo il lavoro!
Tutto bello, se non meraviglioso, fino a questo punto, però... però, però, però, non è tutto oro quel che luccica...
C'è un problema, in particolare: l'inserimento di un Object del file .blend nella scena crea COMUNQUE un oggetto scena nella Gerarchia,
importando quindi nella scena TUTTI gli elementi presenti nel file .blend, non solo il modello selezionato.
Il problema può essere risolto selezionando le voci che non vogliamo nella finestra Gerarchia (che fa riferimento alla scena corrente) e cancellandole
(spostare il mouse nella finestra Scene e premere CANC); Unity ci avviserà che, così facendo, perderemo il collegamento col Prefab, perché la Scena di Blender
è un Prefab e se modifichiamo un'istanza nella Gerarchia, questa non è più un'istanza ma un nuovo elemento a parte.
Se necessario, rivedete la puntata precedente per pensare alle implicazioni che questa operazione può avere, specialmente in progetti ricchi di elementi simili;
inoltre, perdendo il collegamento col Prefab perderemo anche la possibilità di modificare al volo l'oggetto (sia esso un modello 3D che un'immagine)
nel programma di grafica 2D o 3D e vedere le modifiche in tempo reale nella Scena (le modifiche verranno applicate comunque al Prefab nel Project).
Ecco quindi un nodo importante: un file di libreria di modelli 3D contiene molti modelli ma per inserirne uno solo nella scena dobbiamo creare oggetti distinti,
perdendo il discorso del Prefab e delle istanze.
Se non volete perdere il collegamento col Prefab, ad esempio perché volete inserire nella scena tanti oggetti dello stesso tipo provenienti da un file di libreria,
considerate l'idea di fare un file .blend (o .3ds o altro) contenente SOLO l'oggetto che vi interessa, così potrete farne un Prefab e inserire tutte le istanze che volete nella scena...
OPPURE, potete fare come sto per mostrarvi a video. Create un nuovo Prefab vuoto con click destro in Project e Create – Prefab.
Trascinate l'oggetto presente nel file di libreria che volete replicare all'interno del nuovo Prefab, come sto facendo io con Mesh_005 da ScenaBlender.
A questo punto, inserite tutte le copie che volete del Prefab nella Gerarchia o nella scena corrente: avete delle istanze, ma non dell'oggetto preso dal file di libreria,
bensì dal Prefab appena creato.
Questo significa che una modifica fatta nel file di libreria originale (nel mio caso, nel file ScenaBlender.blend) NON si ripeterà nelle istanze appena definite,
perché sono istanze di un Prefab diverso...
… tuttavia (come vedete, i trucchetti non finiscono mai), nessuno ci vieta di selezionare di nuovo l'oggetto presente nel Prefab ScenaBlender e ri-trascinandolo nel Prefab
creato un attimo fa, di fatto aggiornando il Prefab e tutte le sue istanze nella scena!!!
Anzi, vi faccio notare che potete sovrascrivere quel Prefab con un modello completamente diverso: a video, ad esempio, sto trascinando Mesh_048 dal Prefab
ScenaBlender sul Prefab “New Prefab” creato poco fa; confermo l'operazione ed ecco che ho sostituito tutte le istanze in un colpo solo!
Bene, la puntata di oggi finisce qui, d'altronde anche solo i concetti espressi in questa seconda parte meritano una certa riflessione, per assimilare bene tutte le potenzialità...
nella prossima puntata, faremo un piccolo salto, a livello di argomenti, e parleremo un po' dello scripting in JavaScript, perché, sì, Unity è un motore di gioco
che ci fornisce strumenti incredibili in maniera nativa e rende estremamente facile definire un ambiente virtuale, i suoi elementi e le loro caratteristiche,
ma non si può fare un gioco senza definire la logica e le interazioni con un minimo di scripting
(che, come vedremo, è una cosa ben diversa dalla programmazione di... programmi, in senso stretto).
In queste prime puntate stiamo “spizzicando” tra le varie portate, ovvero stiamo vedendo “di tutto un po'”, mi rendo conto che magari questo approccio
può non piacere a tutti ma lo sto facendo per darvi una visione d'insieme del programma e delle funzionalità...
poi approfondiremo le varie voci e vedremo esempi più interessanti.
Continuate a fare domande, osservazioni e suggerimenti nei commenti ai video e, se vi piacciono,
ditelo agli amici e... cliccate sul “mi piace”! A presto!