L'interfaccia grafica di Unity permette di comporre scene molto interessanti, ma senza programmazione non ci potrebbe essere interazione e quindi non potremmo realizzare giochi. In questa lezione, inizieremo a vedere come utilizzare i componenti script per creare interattività.
Programmare in Unity
Come già accennato, per aggiungere interattività in Unity bisogna creare dei componenti personalizzati attraverso la creazione di script, e collegarli ai Game Object in scena, proprio come si fa con i componenti di base come il rigidbody, i collider, ecc.
Chiaramente è possibile creare combinazioni complesse di script che interagiscono fra loro, però alla base di tutto c'è sempre un Game Object in scena che chiama uno (o più) script.
Questi componenti custom si comportano per lo più come i componenti normali, quindi sarà possibile aggiungerli, rimuoverli, abilitarli, disabilitarli, e copiarli da un oggetto all'altro.
A differenza dei componenti custom però, questi script risiedono nel progetto come gli altri asset (texture, suoni, modelli, ...) ed ognuno è rappresentato da un file (con estensione che dipende dal linguaggio usato: .cs
, .js
, .boo
).
Unity prevede l'utilizzo di 3 linguaggi diversi: C#, Javascript, e Boo. Possiamo ottenere essenzialmente le stesse cose con tutti e tre i linguaggi finché si tratta di interagire con gli elementi di Unity (ovvero, se è possibile fare qualcosa specifico di Unity in uno dei tre sarà possibile anche negli altri due).
La differenza sta nello stile dei tre: se preferite avere un linguaggio più strongly typed
a scapito di una verbosità leggermente maggiore, vi troverete bene con C#; se invece siete familiari con JavaScript, potreste usare quello.
Per questa guida il linguaggio prescelto è C#, perché è quello mediamente più usato in Unity e quello per cui si trovano più risorse.
Una rapida panoramica di programmazione
Se non siete familiari col concetto di programmazione ad oggetti, dovreste prima leggere una guida più approfondita sull'argomento per capire le basi, per poi comprendere meglio il funzionamente degli script in Unity.
In breve, gli script in Unity sono tutti classi che ereditano da Monobehavior. Una classe
identifica una categoria di oggetti (fisici, ma anche virtuali) che hanno tutti le stesse proprietà.
Ogni classe ha una sua definizione, contenuta in un file di testo (nel nostro caso, file .cs
), il quale contiene anche tutte le proprietà degli oggetti figli di questa classe. Allo stesso modo, nella definizione di classe saranno presenti tutte le funzioni (metodi) degli oggetti di quella specifica classe.
Inoltre, essendo tutti gli script figli di Monobehavior, esistono funzioni che Unity chiama per noi quando avvengono alcuni eventi. Queste funzioni permettono di definire un flusso di gioco e di rispondere a determinate azioni, come lo scontro fra due oggetti, la disattivazione di un oggetto, e così via. Vediamo un esempio pratico.
Quando successivamente parleremo di classe, intenderemo la classe generica che definisce le caratteristiche dei vari oggetti simili fra loro stabilendo quali siano le funzioni e le proprietà. Possiamo pensare definire funzioni e proprietà dette statiche
, e possiamo pensare che riguardino la classe e non i singoli oggetti (cioè valgono al di là anche senza la creazione di oggetti specifici).
Quando diremo oggetto o istanza, vorrà dire che stiamo parlando del singolo oggetto figlio di quella classe, che ha le sue proprietà con valori personalizzati rispetto agli altri figli della stessa classe.
Creare il primo script
Apriamo una scena vuota in Unity. Creiamo un oggetto vuoto (GameObject > Create Empty
) a cui attaccheremo lo script. Per creare uno script, è sufficiente cliccare Add Component nell'Inspector dell'oggetto appena creato, poi New Script
, dargli un nome e scegliere un linguaggio. Verrà creato un nuovo script con il nome prescelto nella root del progetto.
In alternativa, è possibile creare lo script dal pannello Project
mediante il tasto destro e poi Create > C# Script
. Così facendo però, lo script verrà creato ma non agganciato all'oggetto in scena, e quindi quando premeremo Play, naturalmente, Unity non lo eseguirà.
Se avete creato lo script dal pannello Project
, selezionate l'oggetto in scena e trascinate lo script nell'Inspector
. Oppure, nell'Inspector cliccate su Add Component
e digitate il nome dello script appena creato.
Come consiglio generale, quando avete creato uno script e alla pressione del tasto Play non succede niente, controllate prima che lo script sia effettivamente attaccato almeno ad un gameObject.
Facciamo doppio click sullo script nell'Inspector
o nel Project
. Questo aprirà il programma predefinito per editare gli script, che di default è MonoDevelop. Una volta in MonoDevelop, vedremo una classe che sarà più o meno così:
using UnityEngine;
using System.Collections;
public class MyScript : MonoBehaviour {
// Use this for initialization
void Start () { }
// Update is called once per frame
void Update () { }
}
Come è possibile notare, quando si crea uno script Unity crea la struttura della classe, e aggiunge due funzioni predefinite: Start
ed Update
. Le vedremo in dettaglio più in là, per ora è sufficiente sapere che se attacchiamo questo script ad un oggetto e premiamo Play
, Unity eseguirà all'inizio del gioco quello che c'è scritto fra le parentesi graffe del metodo Start
.
Modifichiamo lo Start
così:
void Start ()
{
Debug.Log("Script attivo sull'oggetto " + gameObject.name);
}
Salviamo lo script, e torniamo a Unity. Unity rileverà la modifica allo script, lo potete notare perché ogni volta che si salva uno script compare una piccola rotellina di caricamento in basso a destra nella finestra principale (sotto l'Inspector). Apriamo il pannello Console
(se non è visibile, basta andare su Window > Console
o premere Ctrl + Shift + C
, e poi premiamo Play.
La console visualizzerà il messaggio "Sono uno script attivo sull'oggetto GameObject"
(dove GameObject sarà il nome che avete dato all'oggetto creato prima). Questo perché Unity esegue tutti gli script della scena, e in quello che abbiamo creato noi trova una funzione Start, che come comportamento predefinito viene eseguita all'inizio del ciclo di vita di un oggetto (ovvero, quando abbiamo premuto Play).
Vedremo più in dettaglio nella prossima lezione come funzionano i vari metodi predefiniti di Unity (Start, Update, ecc.), e per cosa usarli.