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.
Sfida
MedioUna 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):hpdiminuisce diamountmenoarmor, 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
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.
Tutte le lezioni di Fisica e gameplay
1Corpo rigido
Gravità e massaSpingi con AddForceSalta con un impulsoFixedUpdate per la fisicaVelocitàCorpi cinematiciRiepilogo: piattaforma di lancio4Coroutine
InvokeInvokeRepeating, CancelInvokeLa tua prima coroutineCicli nelle coroutineInterrompere le coroutineRiepilogo: conto alla rovescia2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliere