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.
Sfida
FacileRendi Monster astratta e fai in modo che la torre colpisca tutti i tipi di mostri.
- In
Monster, scrivipublic abstract class Monstereprotected abstract void React();, senza corpo. - Ora il compilatore indica
Imp: aggiungiprotected override void React()che aggiungeVector3.forward * 2falla sua posizione. - In
Tower, all'interno del ciclo, chiamaZap()sutarget.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
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