Menu
CoddyTech

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.

challenge icon

Sfida

Facile

Rendi il pupazzo di neve, la campana e lo spaventapasseri IDamageable, così che il martello li colpisca.

  1. Snowman: TakeDamage lo rimpicciolisce di 0.25f * amount su ogni asse; se raggiunge 0.5 o meno, distruggilo.
  2. Bell: registra Dong una volta per punto e aggiungi amount a rings.
  3. Scarecrow: solo il primo colpo esegue transform.Rotate(0f, 0f, 90f);.
  4. In Slam, chiama TakeDamage(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

Esercitati da solo: Playground Unity