Iniziamo col creare un nuovo progetto. La scena di default inizia con due componenti, la Main Camera posizionata alle coordinate (0,1,-10) e la Directional Light alle coordinate (0,3,0).
La Camera (ita. telecamera) è l'oggetto attraverso il quale il giocatore può osservare il mondo. È una matrice, il cui punto di origine è il punto inferiore sinistro di coordinate (0,0), ed il punto finale è quello in alto a destra di coordinate (larghezza,altezza)
Necessitiamo di una struttura per costruire l'orologio. Questo orologio sarà composto da semplici cubi, animati attraverso scripts.
Creiamo dunque nel pannello della gerarchia (eng. Hierarchy) un nuovo oggetto vuoto attraverso Create -> Create Empty. Con lo stesso procedimento, avendo selezionato il nuovo oggetto vuoto, creiamo tre cubi attraverso Create->3D Object->Cube, rendendoli dunque figli del nuovo oggetto. Rinominiamo il nuovo oggetto creato "Orologio", ed impostiamo le sue coordinate a (0,0,0).
Sostanzialmente, qualsiasi cosa si trovi nella scena (cioé il livello che su cu stiamo lavorando) è un GameObject. Ha un nome, un tag, un layer, una componente Transform, e può essere segnato come "Static". Di per sè non è nulla se non un contenitore, utile dunque a contenere altri oggetti.
Un figlio (eng. Child) è un oggetto che nella gerarchia è contenuto da un altro oggetto (detto genitore, eng. parent). Ne eredita la Transform e la applica prima di ogni altra modifica. Dunque se per esempio il figlio si trova a (5,5,0), ed il padre a (1,1,1), il figlio finisce a (6,6,1).
Rinominiamo i cubi creati in "Ore", "Minuti", "Secondi" e cambiamo le scale in modo da avere come posizioni(0, 1, 0),(0, 1.5, 0),(0, 2, 0) e come scala (0.5, 2, 0.5),(0.25, 3, 0.25),(0.1, 4, 0.1), rispettivamente per le ore, i minuti ed i secondi.
Passiamo ora ad animare l'orologio.
Creiamo uno script nella vista del Progetto e chiamiamolo "Animatore_Orologio". Lo apriamo e cominciamo a scrivere le 3 variabili Transform delle Ore, Minuti e Secondi. Attacchiamo questo script all'oggetto creato (io ne ho creato un'altro chiamato "Detentore_Scripts". In genere è l'oggetto che detiene tutti gli script che si occupano di gestire script da non assegnare ad altri oggetti, dunque unici) e trasciniamo sopra le lancette ai relativi campi.
Notiamo che stiamo usando il namespace di UnityEngine, senza il quale non potremmo includere MonoBehaviour.
È come una collezione di definizioni, tipi, strutture, macro, funzioni e quant'altro. Includere i namespace in un progetto è utile per evitare di riscrivere codice già sviluppato. I namespace possono essere innestati (es. System.IO -> namespace System contiene namespace IO)
È la classe del namespace UnityEngine. Contiene tutte le fantastiche funzioni di Unity ed è la classe che fa funzionare cose come Update(), Start(), Awake().
Cominciamo ora a scrivere:
Update(), come altri metodi specifici di Unity, è considerato in modo particolare. Li troverà in ogni caso e li invocherà quando necessario, non importa come li si dichiari. Inoltre è buon uso non dichiarare Update() public perché può essere accesso erroneamente da altre classi, mentre con private qualsiasi altra funzione non potrà vederlo (es. bottoni)
Come dovrebbe muoversi l'orologio? Consideriamo, per ora, un orologio digitale.
Consideriamo la lancetta delle ore. Per compiere un giro completo (360°) deve fare 12 passi; la lancetta dei minuti, invece, 60, come la lancetta dei secondi. Dunque si ha:
la variabile "in_Analogico" tornerà utile più tardi.
Vogliamo conoscere il tempo ad ogni aggiornamento, dunque scriviamo:
Unity simula la scena frame per frame. Idealmente si vuole un rapporto frame/secondi quanto più alto possibile, e Unity consente di settare a quanto si vuole arrivare con Application.targetFrameRate. È di solito ci si assesta attorno ai 60fps (ma molti videogiochi vanno per i 30 per ragioni legate ai motori fisici). Questo vuol dire che Update() viene chiamata 60 volte in un secondo. Di contro la funzione FixedUpdate() viene richiamata ogni K frames. LateUpdate() viene chiamata dopo Update(). C'era anche EarlyUpdate(), ma è stata rimossa visto che è più facile impiegare flag di stato in LateUpdate().
Vogliamo dunque ruotare le lancette modificandone la rotazione:
I quaternioni sono dei costrutti matematici che utilizzano i numeri complessi per gestire movimenti angolari.
Abbiamo ora un orologio digitale in tempo reale. E se ne volessimo uno analogico?
Per cambiare da analogico a digitale ci basta premere il segno di spunta.
Nessun commento:
Posta un commento