PREMESSA:
Se state imparando a programmare questa lezione sarà fondamentale per entrare nel meccanismo di ragionamento che vi aprirà le porte della programmazione. Che usiate Unity o no, in linguaggio C# o altro linguaggio, il sistema di ragionamento per entrare nei meandri della programmazione è il medesimo ed è alla base delle lezioni future. Dunque fare vostri questi concetti è di fondamentale importanza.
INIZIAMO:
Abbiamo già parlato sommariamente dell’istruzione if nella sessione 3 ed ora vedremo come utilizzarla concretamente così da prendere confidenza con le istruzioni di controllo ovvero quelle istruzioni che controlleranno il flusso del programma. Essi vengono chiamati anche costrutti.
I costrutti non sono molti, comunque noi, per le prime lezioni, vedremo solo quelli principali, partendo appunto dall’if…else.
if è un costrutto a se stante e come abbiamo visto, può esistere anche da solo.if(nome=="Mario"){fai questo;}
else è una altro costrutto che però è sempre associato ad un if.
else significa “altrimenti“, ovvero eseguirà le istruzioni solo quando l’if a cui è legato non è vero.
In pratica:
SE(nome==”Mario”)
{
fai questo
}
ATRIMENTI
{
fai quest’altro
}
if(nome=="Mario")
{
fai questo
}
else
{
fai quest'altro
}
Ci siamo già imbattuti nei due uguali, uno dietro l’altro e ci saremo chiesti il perché di due simboli invece che uno solo.
Tutti i simboli sono detti operatori, il più, il meno, il diviso, gli uguale ecc… Parleremo più in dettaglio degli operatori nell’apposita sessione, per ora vi basti sapere che :
pippo=5
è diverso da
pippo==5
– Quando si usa un solo simbolo uguale si sta facendo un’assegnazione, ovvero si sta impostano pippo uguale a 5.
– Mentre, quando si useranno due simboli uguale uno dopo l’altro si sta facendo un controllo, in pratica ci si sta chiedendo: pippo è uguale a 5?
In pratica i due uguale stanno ad intendere una domanda: “Ma pippo è uguale a “Mario”?“
Mentre un solo uguale è un’affermazione: “pippo è uguale a “Mario”.
Il simbolo == fa parte degli operatori chiamati di confronto (o relazionali) che, come suggerisce il nome, mettono in relazione due valori e li confrontano.
Proviamo a fare un esempio più concreto.
Ricordiamoci che una variabile di tipo bool è una variabile che può avere solo due valori, vero o falso, in inglese true o false.
Vediamo come verificare se il giocatore è in possesso di una chiave per aprire una porta.
Nel caso ne sia in possesso eseguirà un metodo, altrimenti ne eseguirà un altro.
public class Player : MonoBehaviour {
//Dichiaro la variabile di tipo bool che mi servirà
bool chiaveRossaRaccolta;
//Metodo che si esegue quando il player tenta di aprire la porta Rossa
void AzioneSullaPortaRossa()
{
if(chiaveRossaRaccolta==true)
{
ApriLaPortaRossa();
}
else
{
MessaggioNoChiave();
}
}
Cosa fa questo script è abbastanza ovvio.
Ci troviamo nella calsse Player, script che ipoteticamente sarà attaccato sul gameObject del giocatore.
Ribadiamo il concetto che un metodo può definirsi come un blocco di codice autonomo che viene richiamato tramite il suo nome.
Quando il giocatore tenterà di aprire la porta verrà eseguito il metodo AzioneSullaPortaRossa().
All’interno di esso avviene un controllo.
Se la variabile chiaveRossaRaccolta risulta true (vera) allora verrà eseguito il metodo ApriLaPortaRossa(), al contrario, se la variabile chiaveRossaRaccolta risulta false (falsa), verrà eseguito il codice dentro l’else, ovvero verrà eseguito il metodo MessaggioNoChiave(), che ipoteticamente visualizzerà un messaggio sullo schermo informando il giocatore che per aprire quella porta è necessaria la chiave rossa.
Le parentesi graffe rappresentano lo scopo del nostro if, ovvero le istruzioni che dovrà eseguire. Allo stesso modo, le parentesi graffe che seguono l’istruzione else rappresentano lo scopo dell’else.
All’interno dello scopo del nostro if potremmo inserire anche molteplici istruzioni, tipo:
//Metodo che si esegue quando il player tenta di aprire la porta Rossa
void AzioneSullaPortaRossa()
{
if(chiaveRossaRaccolta==true)
{
ApriLaPortaRossa();
AggiungiPuntiAlGiocatore();
EliminaChiaveRossaDaInventario();
}
else
{
MessaggioNoChiave();
}
Ovvero, se nel momento in cui il player tentasse di aprire la porta rossa, se risultasse vero che esso è in possesso della chiave rossa, verranno eseguiti i tre metodi:
- ApriLaPortaRossa();
- AggiungiPuntiAlGiocatore();
- EliminaChiaveRossaDaInventario();
Dovremmo aggiungere dunque anche i tre metodi nella nostra classe che risulterà tipo:
public class Player : MonoBehaviour { //Con questa parentesi graffa apro la classe
//Dichiaro la variabile di tipo bool che mi servirà
bool chiaveRossaRaccolta;
//Metodo che si esegue quando il player tenta di aprire la porta Rossa
void AzioneSullaPortaRossa()
{
//Se chiaveRossaRaccolta è vera
if(chiaveRossaRaccolta==true)
{
ApriLaPortaRossa();
AggiungiPuntiAlGiocatore();
EliminaChiaveRossaDaInventario();
}
else //Se chiaveRossaRaccolta è falsa
{
MessaggioNoChiave();
}
} //Con questa parentesi graffa chiudo il metodo AzioneSullaPortaRossa()
void ApriLaPortaRossa()
{
//Animazione della porta che si apre
}
void AggiungiPuntiAlGiocatore()
{
//Aggiungi 1000 punti al giocatore
}
void EliminaChiaveRossaDaInventario()
{
//Elimina la chiave rossa dall'inventario
}
void MessaggioNoChiave()
{
//Invia un messaggio su schermo con scritto "non possiedi la chiave Rossa"
}
}//Con questa parentesi graffa chiudo la classe
Finchè il metodo AzioneSullaPortaRossa() non verrà eseguito, non succederà nulla e tutti i metodi
ApriLaPortaRossa();
AggiungiPuntiAlGiocatore();
EliminaChiaveRossaDaInventario();
MessaggioNoChiave();
saranno “dormineti”, cioè non verranno mai eseguiti.
I primi tre metodi verranno eseguiti solamente se nel momento dell’esecuzione di
AzioneSullaPortaRossa()
la variabile chiaveRossaRaccolta risultasse true (vera).
Il metodo MessaggioNoChiave();
non verrà mai eseguito a meno che, nel momento in cui viene eseguito
AzioneSullaPortaRossa()
la variabile chiaveRossaRaccolta risulti false (falsa).