Menu
CoddyTech

Salute e danni

Fa parte della sezione Fisica e gameplay del percorso Unity di Coddy. Lezione 55 di 71.

Per gestire i danni servono due script. Uno script Health è associato a tutto ciò che può subire danni e gestisce i suoi 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 è contenuto in un file a sé, che porta il nome della sua classe.

GetComponent<Health>() restituisce null per gli oggetti che non hanno Health, come il pavimento, quindi le punte controllano prima di chiamare il metodo. TryGetComponent(out Health health) esegue la ricerca e il controllo con una sola chiamata: restituisce true e assegna un valore a health solo quando il componente è presente.

challenge icon

Sfida

Medio

Fai in modo che ogni colpo conti. Bullet è pronto e chiama TakeDamage(2) su ciò che colpisce.

  1. In Health, completa TakeDamage(int amount): sottrai Mathf.Max(amount - armor, 1) da hp.
  2. Registra name + " hp: " + hp, ad esempio Dummy hp: 2.
  3. Quando hp <= 0, chiama Destroy(gameObject);.

Premi «Gioca» e spara al manichino due volte: registra Dummy hp: 2, poi scompare. Poi premi «Verifica».

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
    }
}

Tutte le lezioni di Fisica e gameplay

Esercitati da solo: Playground Unity