#4 Space Invaders - Vola navicella....Vola - Unity Tutorial
Nel precedente articolo abbiamo creato un esercito di invasori. Ora è il momento di concentrarci sul nostro eroe: il player! Ma non parliamo di un semplice "giocatore". No no no, parliamo di una navicella spaziale in grado di volare tra le stelle e sparare laser senza sosta! Se siete pronti, allacciate le cinture e preparatevi a far volare questa navicella!
Proiettili laser
Prima di far volare la nostra navicella, creiamo la sua arma: i proiettili laser. Dalla cartella Sprites, trasciniamo lo sprite chiamato Laser nella nostra Hierarchy . Coloriamolo con lo stesso colore del player, in modo che l'utente sappia che si tratta del laser del player, Aggiungiamo un Box Collider 2D e spuntiamo la casella is Trigger. Successivamente, rendiamo il proiettile un componente fisico, aggiungendo un RigidBody 2D per simulare la fisica dell'oggetto, inclusi le collisioni. Impostiamo il Body Type del RigidBody 2D su Kinematic. Come abbiamo fatto in precedenza con gli invader, trasciniamo il nostro sprite dalla Hierarchy alla cartella prefab. Una volta fatto, possiamo eliminare il laser dalla Hierarchy.
Selezioniamo il nuovo prefab e aggiungiamo un nuovo layer.
I layer servono a dividere gli oggetti in gruppi distinti, aiutando a controllare quali oggetti interagiscono tra di loro e in quale modo. Aggiungiamo i seguenti layer:
- Player
- Invader
- Laser
- Missile
Ora che abbiamo creato i nostri layer, torniamo al prefab Laser e aggiungiamo il corretto layer. Cambiamo il layer anche al nostro Player, infine andiamo sul nostro prefab Invader_Base e aggiungiamo il layer Invader. Ora andiamo in Edit -> Project Settings, clicchiamo sulla voce Physic 2D e noteremo una matrice di collisione che indica quali layer possono entrare in collisione con altri. Disattiviamo la collisione tra Player e Laser e tra Invader e Laser.
Ora possiamo passare alla scrittura del codice. Iniziamo a creare uno script in C# e chiamiamolo Projectile
- La riga @RequireComponent(typeof(BoxCollider2D)) è un attributo che specifica che il componente richiede la presenza di un BoxCollider2D per funzionare correttamente. Questo assicura che il componente sarà sempre presente sul GameObject al momento dell'esecuzione.
- Sono state create diverse variabili pubbliche, come speed che definisce la velocità del proiettile, direction che definisce la direzione del movimento del proiettile, e destroyed che è un delegato che viene chiamato quando il proiettile viene distrutto.
- Il metodo Awake inizializza il riferimento al componente BoxCollider2D.
- Il metodo OnDestroy viene chiamato quando il componente viene distrutto. Se il delegato destroyed è stato assegnato, viene chiamato con il parametro del proiettile.
- Il metodo Update sposta il GameObject nella direzione del vettore direction alla velocità speed.
- I metodi CheckCollision, OnTriggerEnter2D e OnTriggerStay2D gestiscono le collisioni del proiettile con altri oggetti. In questo caso, quando il proiettile collide con un oggetto, viene distrutto.
Player
Ora passiamo a creare il player, gestire le sue movenze e sparare i laser.
- La variabile speed rappresenta la velocità di movimento orizzontale del personaggio.
- La variabile laserPrefab è il prefab del laser che verrà istanziato quando il personaggio spara.
- La variabile laserActive è un flag booleano per controllare se un laser è attivo o meno, quindi gestire un solo laser alla volta sullo schermo.
- Nel metodo Update(), il player viene mosso a sinistra o a destra in base all'input dell'utente, e viene verificato se il personaggio sta andando oltre i limiti della schermata. In caso affermativo, la posizione del personaggio viene bloccata ai limiti. Quando l'utente preme il tasto "spazio" o fa clic con il mouse, viene chiamato il metodo Shoot().
- Il metodo Shoot() istanzia un nuovo laser solo se non c'è già un laser attivo.
- Il metodo OnLaserDestroyed() viene richiamato quando il laser viene distrutto.
- Nel metodo OnTriggerEnter2D viene chiamato quando il personaggio entra in collisione con un oggetto con il layer "Missile" o "Invader", viene eseguita l'azione "killed".
Ora è possibile testare il gioco e verificare il funzionamento del personaggio e dei suoi laser. Aggiungiamo al nostro Player lo script e aggiungiamo il prefab del laser alla voce Laser Prefab.
Uccidiamo gli invaders
- La variabile speed con l'aggiunta di AnimationCurve, definisce una curva di animazione che può essere utilizzata per controllare l'animazione dei nemici.
- La variabile AmountKilled restituisce il numero di invaders uccisi.
- La variabile AmountAlive restituisce il numero di invaders ancora in vita.
- La variabile TotalAmount restituisce il numero totale di invaders.
- La variabile PercentKilled restituisce la percentuale di invasori uccisi rispetto al totale.
- Nel metodo OnInvaderKilled(), viene chiamato quando viene ucciso un Invader e incrementiamo il contatore
Prima di concludere questo capitolo, affrontiamo la gestione degli attacchi missilistici da parte dei nostri invaders. L'obiettivo è far si che ad ogni X secondi gli invaders sparino dei missili. Dalla cartella Sprites, trasciniamo lo sprite chiamato Missile nella nostra Hierarchy . Aggiungiamo un Box Collider 2D e spuntiamo la casella is Trigger. Successivamente, rendiamo il proiettile un componente fisico, aggiungendo un RigidBody 2D per simulare la fisica dell'oggetto, inclusi le collisioni. Impostiamo il Body Type del RigidBody 2D su Kinematic. Aggiungiamo lo script Projectile e configuriamo i valori Speed: 20, Direction Y: -1 e aggiungiamo il Layer creato in precedenza chiamato Missile.
- La variabile missilePrefab corrisponde al prefab del missile.
- La variabile missileSpawnRate indica la cadenza di fuoco.
- Nel metodo OnStart(), invoca in modo ripetitivo il metono MissileAttack
- Nel metodo MissileAttack(), calcola quanti invasori sono ancora vivi richiamando il metono getAliveCount e in modo casuale lancia un missile.
Commenti
Posta un commento