IDamageable
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 6 di 50.
In un gioco molte cose possono subire danni e hanno poco altro in comune: il giocatore ha punti vita, una cassa si rompe al primo colpo. Una classe base condivisa le costringerebbe a far parte della stessa famiglia. Un’interfaccia definisce l’unica cosa che hanno in comune, e ogni script la implementa a modo suo:
public interface IDamageable
{
void TakeDamage(int amount);
}public class PlayerHealth : MonoBehaviour, IDamageable
{
public int hp = 10;
public void TakeDamage(int amount)
{
hp -= amount;
Debug.Log("Ouch! hp: " + hp);
}
}public class Crate : MonoBehaviour, IDamageable
{
public void TakeDamage(int amount)
{
Destroy(gameObject);
}
}Uno script ha comunque una sola classe base, MonoBehaviour, e poi elenca le interfacce. L’interfaccia va inserita in un file a sé, IDamageable.cs, e non deriva da MonoBehaviour: non è un componente e non viene mai aggiunta a un oggetto da sola. Una classe che la elenca deve avere un metodo pubblico TakeDamage(int), altrimenti il codice non viene compilato.
Chiunque infligga danni richiede l’interfaccia, non una classe:
// Fireball.cs
void OnCollisionEnter(Collision collision)
{
IDamageable target = collision.gameObject.GetComponent<IDamageable>();
if (target != null)
{
target.TakeDamage(3);
}
Destroy(gameObject);
}La palla di fuoco danneggia il giocatore e rompe le casse usando le stesse righe, e in seguito si può aggiungere un tipo di bersaglio senza dover modificare questo codice. Unity non mostra nell’Inspector un campo di tipo interfaccia, quindi gli script mantengono un GameObject o un componente e gli chiedono l’interfaccia, come fa la palla di fuoco.
Sfida
FacileUn gigante sorveglia la piazza del villaggio. Le frecce muovono il Gigante (Mover.cs, pronto) e la barra spaziatrice fa oscillare il suo martello: Hammer.cs chiama Slam(), che trova ogni collider entro radius. Tre cose nella piazza vengono colpite, ciascuna a modo suo, senza condividere nient’altro:
Snowman: ogni punto di danno riduce di 0.25 le sue dimensioni su ciascun asse (parte da 1.5). Quando le dimensioni sono pari o inferiori a 0.5, si scioglie: distruggi il pupazzo di neve.Bell: registraDonguna volta per ogni punto di danno (un colpo da 2 lo registra due volte) e aggiunge i punti arings.Scarecrow: il primo colpo lo fa cadere, ruotandolo di 90 gradi attorno all’asse z, indipendentemente dal danno. I colpi successivi non cambiano nulla.
IDamageable.cs dichiara l’interfaccia, con un solo metodo: void TakeDamage(int amount). Fai implementare questa interfaccia a Snowman, Bell e Scarecrow, ciascuno con la propria reazione. Poi, in Slam, chiama TakeDamage(power) sull’IDamageable di ciascun collider trovato. I collider che non ne hanno uno, come il terreno, vengono ignorati.
Premi Play, avvicinati a ciascuno di loro e colpisci, poi premi Check.
Provalo tu
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRiepilogo: torretta modulare4Dati serializzati
Classi serializzabiliListe nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottino7Macchine a stati
Gli stati come classiUna macchina a statiTransizioniIntelligenze dei nemiciRiepilogo: stati della porta10Progetto: Sopravvissuto nell’arena
L’eroeTipi di nemici5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseOndate come datiRiepilogo: database degli oggetti