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.
Sfida
MedioFai in modo che ogni colpo conti. Bullet è pronto e chiama TakeDamage(2) su ciò che colpisce.
- In
Health, completaTakeDamage(int amount): sottraiMathf.Max(amount - armor, 1)dahp. - Registra
name + " hp: " + hp, ad esempioDummy hp: 2. - Quando
hp <= 0, chiamaDestroy(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
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 rovescia7Rotazione
Angoli di EuleroQuaternioniGuarda nella direzione in cui ti muoviRuota in modo fluidoRiepilogo: Torretta10Progetto: Fuga dall'arena
L'arenaCacciatori2Collisioni
OnCollisionEnterCosa ho colpito?Rompersi all'impattoRestare a terraRimbalzo e attritoForme dei ColliderRiepilogo: muro distruttibile5Progetto: Corsa alle monete
La palla rotolanteMonete da raccogliereEsercitati da solo: Playground Unity