La
nostra azienda porta avanti da anni un progetto di CAD 3D specializzato
per studi di propagazione elettromagnetica su grandi scenari.

Esempio di scenario
l
progetto inizialmente sviluppato in OpenGL, poi su VTK, si è evoluto al
punto tale da dover scegliere una soluzione commerciale che permettesse
uno sviluppo più rapido delle funzionalità richieste. I framework che
si avvicinano più alle nostre esigenze sono principalmente Unreal Engine e Unity. Entrambe le soluzioni sono valide e affidabili ma hanno delle differenze sostanziali per cui si è deciso per Unity. Infatti l'Unreal Engine avendo
una community più ristretta (per quanto ampia) non permette una veloce
risoluzione delle problematiche che normalmente si riscontrano durante
lo sviluppo di un programma, inoltre il linguaggio di programmazione è
C++ (misto a Blueprints per le cose più semplici), un linguaggio più
lontano dal Java usato nelle versioni precedenti del progetto. Unity è
un framework nato nel 2005 con l'idea di allargare il bacino di utenza
intorno alla programmazione 3D, è stato ben accolto dai programmatori e
negli anni si è generata una community molto ampia che ha permesso la
creazione di tool e tutorial su ogni funzionalità per un veloce
apprendimento. Nasce già multipiattaforma e soprattutto permette di
adattare velocemente il programma a dispositivi mobile. Il linguaggio di
programmazione è il C#, di facile apprendimento per chi non ha mai
programmato.
Iniziare a programmare in Unity risulta semplice, basta andare nel sito ufficiale ( https://unity.com/ ),
registrarsi e scaricare l'hub per la gestione dei progetti. Unity è in
continua evoluzione e per questo motivo alla nascita di un nuovo
progetto viene chiesta la versione da voler utilizzare, una volta scelta
il passaggio a quella successiva è sempre possibile ma può richiedere
uno sforzo aggiuntivo per adattare il codice alle nuove funzionalità
(consiglio di mantenere i progetti a lungo periodo sempre aggiornati).

Creazione di un progetto
La
console alla creazione di un nuovo progetto chiede come prima cosa che
tipologia di progetto abbiamo necessità di creare, ci focalizzeremo su
un progetto 3D, quindi selezioniamo "3D" e diamo un nome al nostro
progetto. Ci ritroveremo davanti la console principale di Unity, sulla
sinistra un albero contentente tutti gli oggetti presenti nella scena
corrente, sulla destra un pannello inspector che da le informazioni
sull'oggetto della scena correntemente selezionato e in fine un pannello
sottostante che espone il contenuto delle cartelle del progetto. Nella
zona centrale viene renderizzata la scena corrente, notare come siano
presenti più tab, i più importanti risultano "Scene" e "Game", il primo permette di visualizzare e modificare gli oggetti all'interno della scena, il "Game" invece mostra quanto viene renderizzato dalla camera principale.
Terminologia fondamentale per iniziare:
- scene: tutto ciò che appartiene al contesto corrente, un progetto può avere più scene e vi è la possibilità di passare da una all'altra durante l'esecuzione, è possibile anche farne il merge ma è una feature meno usata.
- GameObject: ogni oggetto presente all'interno della scena è un GameObject, questa classe si specializza con l'aggiunta di componenti specifiche.
Alla creazione del progetto nella scene creata sono presenti già una Main Camera (la camera principale sfruttata per visualizzare la scene una volta avviato il programma) e una Direct Light(gestisce l'illunminazione principale). L'aggiunta di un elemento nella scene può avvenire programmaticamente o più semplicemente con il click destro sulla sezione di sinistra del framework, un primo elemento che possiamo aggiungere è un cube, questo possiamo farlo selezionandolo come in figura. Con la stessa modalità è possibile inserire tutta una serie di primitive geometriche già preconfigurate.

Aggiunta di un cubo

Inspect di un cubo 1.
Possiamo
vedere per il cubo, nel pannello di destra, un esempio delle proprietà
più comuni quali posizione/traslazione/scale e più specifiche quali Mesh
Filter e Render (deputate alla sua visualizzazione) oltre che il Box
Collider(deputato, come suggerisce il nome, a gestire le collisioni con
gli altri elementi della scena). Posizioniamolo in coordinate 0,0,0
modificando la sua Position così da averlo visualizzato di fronte alla
nostra camera.

Inspect di un cubo 1.1
Per comandare i singoliGameObject si
devono scrivere degli script e associarli ad essi. Per creare un primo
script consiglio di creare una cartella Scripts all'interno della
cartella Assets dove andranno ad essere salvati.

Creazione di una cartella
Una volta creata al suo interno con la stessa modalità creare un C#
Script e dargli un nome, una volta creato doppio click su esso per
aprirlo con il vostro editor (consiglio Visual Studio 2019 o Rider).

Creazione di uno script
Si può vedere che lo script creato eredita dalla classe MonoBehaviour, questa permette di accedere a tutte le proprietà del GameObject a cui verrà associato. Sono presenti già 2 funzioni vuote:
- Start viene chiamata solo al primo frame, ovvero alla creazione dell'oggetto.
- Update è chiamata ad ogni frame e permette di cambiare in realtime lo stato dell'oggetto.
Modifichiamo lo script Update aggiungendo una semplice riga di codice così da capirne il funzionamento.
Con questo comando accediamo alla componente rotation delGameObject e gli imponiamo di ruotare di 5 gradi ad ogni frame (fixedTime è il tempo trascorso dal run del progetto).
Infine
associamo questo script al cubo della scena, per farlo possiamo
semplicemente trascinare lo script sopra l'oggetto o cliccare sul cubo,
premere Add Component e quindi selezionare il nostro script dalla lista di elementi presenti

Aggiunta di un componente
Fatto questo possiamo premere il tastoPlay presente in alto al centro della schermata per vedere il cubo iniziare a ruotare.
Con
quanto scritto penso di aver sintetizzato l'approccio di Unity alla
creazione di un nuovo progetto. In futuro prevedo di fare un articolo
sulla creazione di una camera adatta alla visualizzazione a 360 gradi di
un ambiente 3D.
Il progetto è scaricabile al seguente indirizzo: https://static.netfarm.it/blog/test_unity_blog.zip

Alessandro Oddo
- Area Manager Scientific Software -
Perchè usare Unity per i propri progetti 3D e prime nozioni
scientific software