Vediamo adesso come creare delle Monete da raccogliere ed una rudimentale interfaccia utente:
Per prima cosa, creiamo un semplice cilindro all’interno della nostra scena, ruotandolo e scalandolo fino a dargli la forma di una (rudimentale, molto rudimentale!) moneta.
Impostando i valori di scala in X=1, Y=0.1 e Z=1 dovremmo ottenere qualcosa di abbastanza simile a ciò che cerchiamo! Ruotiamo quindi la moneta e posizioniamola nell’arena di gioco.
Nella nostra moneta aggiungiamo un componente di tipo “Constant Force” (Lo trovi nel menù “Physics”) e impostiamo il valore “Torque” relativo all’asse Y ad 1.
Nota che, assieme al componente Constant force, è stato aggiunto anche un Rigidbody! Questo perchè, come suggerisce il nome, il componente Constant Force applica una forza costante al nostro oggetto (la moneta in questo caso), e avendo a che fare con la fisica, esso dipende dal componente Rigidbody.
Disattiva la spunta su “Use Gravity” dal componente Rigidbody della moneta; così facendo essa ruoterà a mezz’aria, acquisendo un certo appeal agli occhi del giocatore! Niente in un videogioco grida “Raccoglimi!” più di una moneta che rotea a mezz’aria!
Uno script per la nostra moneta
Per far sì che la nostra moneta sia completamente funzionante, occorre creare un semplice script che la faccia scomparire quando essa entra in contatto col giocatore. Creiamo quindi uno script all’interno della moneta, e chiamiamiolo CoinScript. Andremo a scrivere il seguente codice:
using UnityEngine;
using System.Collections;
public class CoinScript : MonoBehaviour {
void OnTriggerEnter(Collider coll){
if(coll.gameObject.CompareTag("Player")){
gameObject.SetActive(false);
}
}
}
come puoi vedere, in questo caso non abbiamo utilizzato nessuna delle funzioni Start() ed Update(). Al loro posto abbiamo utilizzato la funzione OnTriggerEnter, che si attiva ogni volta che l’oggetto che contiene lo script subisce un urto.
Molto semplicemente, ogni volta che la nostra moneta subisce un urto, esamina il Tag dell’oggetto che l’ha colpita. Se il Tag è “Player”, la moneta viene disattivata, e quindi scomparirà dal gioco.
Cos’è un tag? Lo scoprai fra pochissimo!
Per il momento salviamo lo script e… non funziona! Non ancora, almeno. Per farlo funzionare, dovremo eseguire due semplici passaggi:
Per prima cosa, dal componente “Capsule Collider” della nostra moneta, bisogna spuntare la casella “Is Trigger”, che come abbiamo visto non farà reagire la moneta agli urti, ma farà in modo che la collisione venga registrata, così da poter aggiungere una reazione all’urto tramite script.
Nel nostro script inoltre, si fa riferimento ad un “tag”, che altro non è che un’etichetta da assegnare ai nostri oggetti al fine di farli interagire facilmente con alcuni script. Per far sì che lo script funzioni, dobbiamo modificare il tag della nostra sfera ed impostarlo come “Player”, e per farlo, basta selezionare la sfera e selezionare il tag “Player” dal suo inspector panel. (Di default, il tag è “Untagged”)
Adesso tutto funziona a dovere, dobbiamo solo moltiplicare le nostre monete! Per farlo creeremo un prefab.
Un prefrab non è altro che un game object che viene savlato con tutti i suoi componenti, script e relativi valori. Per crearne uno della nostra moneta basterà trascinarla dall’Hierarchy panel al project panel. Da qui possiamo trascinarne quante ne vogliamo in giro per la nostra scena!
Ricorda il numero di monete che metterai all’interno dell’area di gioco: ci servirà per il prossimo punto!
Aggiungere un’interfaccia al gioco
Per concludere avremo bisogno di una piccola UI (o interfaccia utente) e di un messaggio che ci segnali la fine del gioco al raccoglimento di tutte le monete. Creiamo quindi un oggetto di tipo “Text” Sotto il menù “Create>UI>Text”
Clicchiamo sul pulsante relativo all’ancoraggio del testo, e tenendo premuti i tasti Shift ed Alt clicchiamo sul pulsante “Top-Left”. Il testo sarà adesso ancorato in alto a destra del nostro schermo! Cambiamo i valori Pos X=10 e Pos Y= -2 0 per creare un po’ di spazio dal margine della schermata e per finire cambiamo lo stile del carattere in grassetto (Bold) per renderlo più leggibile.Creiamo un altro oggetto text assicurandoci che anch’esso si trovi sotto l’oggetto Canvas, ed anche in questo caso modifichiamo l’ancoraggio del testo tenendo premuti i tasti Alt e Shift, ma stavolta selezioniamo l’icona che indica il centro dello schermo.Aumentiamo le dimensioni di questo text field e modifichiamo entrambi i parametri “Horizontal Overflow” e “Vertical Overflow” in “Overflow”, così da mostrare la scritta anche se di dimensioni eccessive.
Ricordati anche di allineare il testo al centro per far sì che esso appaia al centro dello schermo.
A questo punto occorre Cancellare il testo di entrambi i nostri oggetti testo. Adesso in game mode non appariranno più le scritte, ma gli oggetti che abbiamo creato sono ancora lì! è questo ciò che conta!
Torniamo brevemente allo script CoinScript che abbiamo creato per le monete e modifichiamolo in modo che esso possa gestire i due campi di testo che abbiamo creato. Il codice completo dello script sarà il seguente:
using UnityEngine;
using UnityEngine.UI;
using System.Collections;
public class CoinScript : MonoBehaviour {
public PlayerController controller;
public int points = 0;
public Text score;
public Text gameOver;
void Start(){
score.text = "Score: " + points;
}
void OnTriggerEnter(Collider coll){
if(coll.gameObject.CompareTag("Player")){
gameObject.SetActive(false);
controller =coll.gameObject.GetComponent<PlayerController>();
controller.coinsCollected++;
points= controller.coinsCollected;
score.text = "Score: " + points;
if(points == 8){
score.text = null;
gameOver.text = "Game Over!";
Time.timeScale = 0.0f;
}
}
}
}
Benchè ad occhio possa sembrare molto più complesso di prima, in realtà i cambiamenti sono davvero pochi: questo codice non farà altro che tener conto delle monete raccolte, aggiornando il punteggio ad ogni moneta raccolta. Al raggiungimento di un certo numero di monete (in questo caso 8), lo script bloccherà il gioco, mostrando il messaggio “Game Over!”
Se nel tuo gioco hai inserito più di 8 monete, dovrai cambiare il numero 8 nella riga
if(points == 8)
con il numero di monete utilizzate!
Occorre aggiornare i riferimenti dello script per ogni singola moneta, quindi, per farlo velocemente, selezioniamo tutte le monete dal nostro Hierarchy Panel (tendendo premuto CTRL o Cmd e cliccando su ogni moneta, o tenendo premuto shift e cliccando la prima e l’ultima moneta!)e assegnamo la nostra palla alla variabile “Player”, il primo Text alla variabile “Score” e il secondo Text alla variabile “Game Over”.
Il nostro gioco è adesso completamente funzionante, ma… è bianco! Troppo bianco! Nella prossima lezione gli daremo un po’ di colore, oltre ad “impacchettare” il gioco e prepararlo per la distribuzione!