Menu
CoddyTech

Componenti astratti

Fa parte della sezione Architettura dei giochi in Unity del percorso Unity di Coddy. Lezione 3 di 64.

Alcune classi base descrivono un tipo di cosa che non esiste mai da sola. Ogni arma spara, ma un’arma che non è né una pistola né un fucile a pompa non ha modo di sparare. Contrassegna una classe del genere come abstract e dichiara ogni passaggio che le sue sottoclassi devono scrivere come metodo astratto, senza corpo:

public abstract class Weapon : MonoBehaviour
{
    public int shots;

    public void Pull()
    {
        shots++;
        Fire();
    }

    protected abstract void Fire();
}
public class Shotgun : Weapon
{
    public GameObject pelletPrefab;

    protected override void Fire()
    {
        for (int i = -1; i <= 1; i++)
        {
            Instantiate(pelletPrefab, transform.position + transform.right * i * 0.3f, transform.rotation);
        }
    }
}

Una sottoclasse che non scrive Fire non viene compilata: CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. Unity inoltre non consente di aggiungere uno script astratto a un oggetto. Trascina Weapon su un oggetto e apparirà il messaggio Can't add script behaviour 'Weapon'. The script class can't be abstract!, perché Unity non potrebbe creare un’arma senza Fire.

Gli altri script continuano a funzionare con il tipo base. GetComponent<Weapon>() restituisce la sottoclasse presente sull’oggetto e Pull() esegue Fire di quella sottoclasse:

// Player.cs
private Weapon weapon;

void Start()
{
    weapon = GetComponent<Weapon>();
}

void Update()
{
    if (Mouse.current.leftButton.wasPressedThisFrame)
    {
        weapon.Pull();
    }
}

Sostituisci il componente Shotgun con Pistol e lo script Player rimane invariato.

challenge icon

Sfida

Facile

Rendi Monster astratta e fai in modo che la torre colpisca tutti i tipi di mostri.

  1. In Monster, scrivi public abstract class Monster e protected abstract void React();, senza corpo.
  2. Ora il compilatore indica Imp: aggiungi protected override void React() che aggiunge Vector3.forward * 2f alla sua posizione.
  3. In Tower, all'interno del ciclo, chiama Zap() su target.GetComponent<Monster>().

Premi «Gioca» e la barra spaziatrice: gli slime si rimpiccioliscono, l'imp salta all'indietro. Poi premi «Verifica».

Provalo tu

using UnityEngine;

// Ciò che tutti i mostri hanno in comune.
public class Monster : MonoBehaviour
{
    public int hp = 3;

    public void Zap()
    {
        hp--;
        if (hp <= 0)
        {
            Destroy(gameObject);
        }
        else
        {
            React();
        }
    }

    // Come reagisce questo tipo di mostro a una scarica a cui sopravvive.
    protected virtual void React()
    {
    }
}

Tutte le lezioni di Architettura dei giochi in Unity

Esercitati da solo: Playground Unity