IDamageable
Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 7 di 64.
Un'interfaccia è un elenco di metodi che una classe si impegna a includere, senza codice al loro interno. Classi che non hanno nient'altro in comune possono fare la stessa promessa. In C# semplice:
interface IGreeter
{
string Greet();
}
class Robot : IGreeter
{
public string Greet() { return "Beep"; }
}
class Cat : IGreeter
{
public string Greet() { return "Meow"; }
}Una variabile di tipo IGreeter può contenere un Robot o un Cat, e greeter.Greet() esegue il metodo dell'oggetto che contiene. Una classe che elenca IGreeter ma non ha un metodo pubblico Greet() non viene compilata.
In un gioco, molte cose possono subire danni e hanno poco altro in comune: il giocatore ha punti ferita, una cassa si rompe al primo colpo. Una classe base condivisa le costringerebbe a far parte della stessa famiglia. Un'interfaccia dà un nome all'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 dopo di essa elenca le interfacce. L'interfaccia va in un file a parte, IDamageable.cs, e non deriva da MonoBehaviour: non è un componente e non va mai aggiunta a un oggetto da sola. Una classe che la elenca deve avere un metodo pubblico TakeDamage(int), altrimenti non viene compilata.
Ciò che infligge il danno 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 ferisce il giocatore e rompe le casse con le stesse righe, e un tipo di bersaglio aggiunto in seguito non richiede modifiche qui. 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
FacileRendi il pupazzo di neve, la campana e lo spaventapasseri IDamageable, così che il martello li colpisca.
Snowman:TakeDamagelo rimpicciolisce di0.25f * amountsu ogni asse; se raggiunge 0.5 o meno, distruggilo.Bell: registraDonguna volta per punto e aggiungiamountarings.Scarecrow: solo il primo colpo eseguetransform.Rotate(0f, 0f, 90f);.- In
Slam, chiamaTakeDamage(power)su ogni IDamageable del collider, se presente.
Premi «Gioca» e colpisci ciascuno. Poi premi «Verifica».
Provalo tu
using UnityEngine;
public class Snowman : MonoBehaviour
{
}
Tutte le lezioni di Architettura dei giochi in Unity
1Componenti, non gerarchie
Componenti piccoliUno script base per i nemiciComponenti astrattiComponenti che collaboranoRipasso: torretta modulareRipasso: cannone doppio4Dati serializzati
Classi serializzabiliElenchi nell'InspectorEnum nell'InspectorRiepilogo: tabella del bottinoRiepilogo: tira il bottino2Interfacce in Unity
IDamageableInterfacce e TryGetComponentGetComponentsRiepilogo: tasto InteragisciRiepilogo: il più vicino a portata5ScriptableObjects
Asset di datiStatistiche delle armiImpostazioni condiviseSalva il ventoOnde come datiRiepilogo: database degli oggettiRiepilogo: comprare dal negozioEsercitati da solo: Playground Unity