Guida pratica a Unity3D

Guida pratica a Unity3D

Cos’è Unity3D

Unity3D è un ambiente di sviluppo visuale per videogiochi in 3D, che può essere usato per creare anche videogame in 2 dimensioni e che, in genere, è molto utilizzato per produrre giochi da parte di sviluppatori indie.

Oggi vi ripropongo una guida su Unity3D che avevo scritto nel 2011, e che all’epoca utilizzavo per sperimentare un po’ di cose nell’ambito dello sviluppo di videogame.

Interfaccia di Unity3D: presentazione rapida

Dopo aver installato ed aperto Unity3D, selezionate Window->Layouts->2 by 3 ed avrete suddiviso la vostra interfaccia in 5 parti distinte.


Esse sono:1. Scene View: utile per posizionare gli oggetti del gioco
2. Game View: anteprima di come si vedrà il gioco
3. Hierarchy View: lista di tutti gli oggetti presenti nella SCENA (ovvero nel livello corrente: ogni progetto puo’ essere fatto da più livelli, ovviamente)
4. Project View: mostra tutti i package e gli asset pronti ad essere inseriti nel gioco.
5. Inspector View: mostra le proprietà delle componenti, delle variabili delle componenti e permette di visualizzare i watch per fare debug.

Ciclo di vita di un Game Object

In generale usiamo associare degli script (in JS, C# o Boo) allo scopo di stabilire il comportamento dei vari personaggi e degli oggetti che compongono il nostro videogioco tridimensionale: è utile considerare le funzioni più importanti e visualizzare il cosiddetto “ciclo di vita” di un generico oggetto Unity3D.

Leggendo da destra a sinistra avremo: inizialmente viene eseguito quanto contenuto nel blocco di codice dello script Awake() (risveglio), e subito dopo se lo script è abilitato si esegue il blocco Start() per ulteriori inizializzazioni. Alla fine si passa alla fase di Update(), che viene eseguita per ogni singolo frame del gioco (quindi a velocità molto elevata), oppure LateUpdate che viene invece ripetuta ogni secondo fisico.

Se lo script non fosse abilitato si passa direttamente alla fase Update() / FixedUpdate().

Problemi di proporzioni tra GameObject: scale factor

L’immagine successiva foto illustra un esempio di quello che sto dicendo: nel tutorial di realizzazione di un First Person Shooter (FPS), ad esempio, è necessario fare attenzione alle proporzioni con cui si importa un oggetto.


Per settare le proporzioni è necessario sul fattore di scala (Scale factor) della componente FBX dello scenario, e successivamente proporzionare egualmente il controller del giocatore in prima persona.Per quanto riguarda gli oggetti tridimensionali che importate in FBX, come per qualsiasi altro GameObject visibile, è possibile impostare il fattore di scala con un numero (eventualmente anche decimale come 0.1, 0.05 e via dicendo).

Awake(), Update(), Start() FixedUpdate() (funzioni di base)

Si tratta delle tre funzioni basilari che vengono utilizzate per decidere il comportamento (o behaviour) dei GameObject: la prima, cioè Update() effettua periodicamente la sequenza di comandi inclusa tra le sue parentesi graffe, analogamente a ciò che fa FixedUpdate(), che invece utilizza un tempo fisico. Ricordiamo che tutto quello presente in queste funzioni viene verificato o eseguito periodicamente.Awake() invece, per chi fosse familiare con la programmazione ad oggetti è una sorta di costruttore, ovvero viene richiamato una singola volta all’inizio, quando si decide quanto debba valere all’istante 0 una certa variabile di tipo generico.

Di seguito Awake() viene utilizzato per inizializzare il target, operazione tipica che viene fatta allo scopo di identificare la posizione del player.

private var target : GameObject;

function Awake () {
target = GameObject.FindWithTag (“Player”);
}

Start() è simile, con la differenza che viene richiamato prima di fare la prima volta Update().

Importare nuovi file nel progetto del videogioco

L’operazione di importazione di nuovi contenuti all’interno dei vostri progetti Unity3D è facilmente effettuabile direttamente da Gestione Risorse (per Windows) o dal Finder (per Mac).


Nel momento in cui si copia un contenuto all’interno della cartella del progetto, infatti, Unity3D (una volta messo nuovamente in primo piano) provvederà automaticamente ad aggiornare la cartella con i nuovi contenuti: questo vale sia se spostate qualche file o directory, sia se provvedete a modificare o rinominare qualsiasi cosa ivi contenuta.

Errori di compilazione in Unity 3D

Un errore di compilazione viene notificato non appena si prova a premere il tasto “Play” per provare la scena del gioco appena creato; a differenza degli errori a run-time, che si possono verificare soltanto durante lo svolgimento dello stesso, quelli di compilazione vengono notificati immediatamente.


La loro natura, dunque, è facile da correggere visto che nella console in basso normalmente viene segnalata la riga in cui si verifica l’errore, che sarà tipicamente di sintassi (parole scritte male, punti e virgola mancanti ecc. Dopo aver corretto tornerà tutto normale e sarà possibile proseguire il lavoro.

Muovere i GameObject (Operazioni di base)

Dopo aver associato lo script all’oggetto possiamo fare le seguenti operazioni tipiche.

Ruotare un oggetto:

function Update() {
transform.Rotate(0, 5, 0);
}

Muovere in avanti un oggetto:

function Update() {
transform.Translate(0, 0, 2);
}

Accesso alle Component dei GameObject

Probabilmente il primo scoglio nella sintassi di scripting di Unity3D riguarda l’accesso alle diverse componenti: per me, che provengo dalla programmazione orientata agli oggetti (OO), si tratta di fare un piccolo sforzo concettuale nel comprendere che, ad esempio, il riferimento a this (l’oggetto corrente) è sottinteso, nel senso che viene realizzato:

  • mediante gli alias transform, renderer, collider, animation, … sul “this” (se scritti in minuscolo sono variabili o “oggetti”, se in maiuscono invece sono le corrispondenti classi);
  • mediante drag’n drop per riferimenti esterni.

Alias significa, in altri termini, che scrivere transform.Translate(1, 3, 2); equivale a GetComponent(Transform).Translate(1, 3, 2); inizialmente, inoltre, per ogni GameObject gli alias sono settati a null di default.

Le varie parti di un determinato oggetto sono riferite mediante dot notation (ad esempio translate.qualcosa=”ciao”)

Distanza tra due GameObject

Credo che il seguente esempio sia piuttosto esplicativo di come si possano utilizza la funzione di distanza tra due vettori dello spazio tridimensionale (anche se qui, di fatto, calcola la distanza tra due “punti”: il nostro giocatore ed un oggetto nemico):

var enemy : Transform;

function Update() {
if ( Vector3.Distance( enemy.position, transform.position ) < 10 )
print(“I sense the enemy is near!”);
}

Variabili globali (o statiche)

La variabile qualcosa è impostata come statica nello Script1.js:

static var qualcosa = 5;Questo significa che esternamente a Script1.js potrò accedervi con la seguente notazione:

variable name.print(Script1.qualcosa);
Script1.qualcosa++;

Introdurre il tempo nel codice

Come nella programmazione concorrente esiste la funzione yield – scritta senza () – che serve ad impostare un’ attesa, nell’esecuzione del codice, di tot frame:
function Update(){

yield; //attende un frame
yieldWaitForSeconds (2); //attende 2 secondi

}

Manipolare il Transform di un GameObject


Transform contiene tutte le informazioni su posizione, rotazione e scala di un oggetto tridimensionale (o GameObject): di seguito riporto le istruzioni utili per manipolarle. Ovviamente a queste tre corrispondenti variabili è necessario assegnare un oggetto vettore (Vector3) o, se si tratta di una rotazione, di un Quaternion:transform.position = Vector3(0, 0, 0);
transform.rotation = Quaternion.identity; //means no rotation
transform.localScale += Vector3(0.1,0,0);

1 voto


Informazioni sull'autore

Salvatore Capolupo

Consulente SEO, ingegnere informatico e fondatore di Trovalost.it, Pagare.online, Lipercubo.it e tanti altri. Di solito passo inosservato e non ne approfitto.