Menu
CoddyTech

Salute e danni

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 53 di 63.

Per infliggere danni servono due script. Uno script Health è presente su tutto ciò che può subire danni e gestisce i propri punti vita; ciò che infligge i danni trova quello script e ne chiama un metodo. Ecco lo script Health di una cassa che si rompe dopo tre colpi e quello delle punte che danneggiano tutto ciò che ci atterra sopra:

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 3;

    public void TakeDamage(int amount)
    {
        hp -= amount;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
    }
}
public class Spikes : MonoBehaviour
{
    void OnCollisionEnter(Collision collision)
    {
        Health health = collision.gameObject.GetComponent<Health>();
        if (health != null)
        {
            health.TakeDamage(1);
        }
    }
}

TakeDamage è public, quindi gli altri script possono chiamarlo, ed è l'unico codice che modifica hp. Punte, proiettili e lava chiamano tutti lo stesso metodo, mentre solo lo script Health decide cosa significa 0: distruggere la cassa, terminare la partita o riprodurre un'animazione di morte. Ogni script si trova nel proprio file, che ha il nome della relativa classe.

GetComponent<Health>() restituisce null per gli oggetti che non hanno Health, come il pavimento, quindi le punte effettuano un controllo prima di chiamarlo. TryGetComponent(out Health health) esegue la ricerca e il controllo in un'unica chiamata: restituisce true e assegna un valore a health solo quando trova un componente Health.

challenge icon

Sfida

Medio

Una pistola da allenamento spara a un manichino e a un cavaliere corazzato. Lo script Shooter sulla pistola è pronto: le frecce sinistra e destra la fanno ruotare e la barra spaziatrice spara un proiettile. Scrivi i due script che fanno sì che i colpi vadano a segno.

Health, sul manichino e sul cavaliere (l’Inspector imposta hp e armor):

  • Un metodo pubblico TakeDamage(int amount): hp diminuisce di amount meno armor, ma sempre di almeno 1.
  • Dopo ogni colpo, registra il nome dell’oggetto e gli hp rimanenti, come Dummy hp: 2.
  • Quando gli hp sono pari o inferiori a 0, distruggi l’oggetto.

Bullet, su ogni proiettile (l’Inspector imposta damage a 2):

  • Quando il proiettile colpisce qualcosa che ha un componente Health, chiama il suo TakeDamage(damage).
  • Qualunque cosa colpisca, muro compreso, distruggi il proiettile.

Premi Play, abbatti il manichino e il cavaliere, poi premi Check.

Provalo tu

using UnityEngine;

public class Health : MonoBehaviour
{
    [SerializeField] private int hp = 4;
    [SerializeField] private int armor = 0;

    public void TakeDamage(int amount)
    {
        // sottrai amount meno armor (almeno 1), registra quanto rimane, distruggi a 0
    }
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Fisica e gameplay