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