Menu
CoddyTech

Composants abstraits

Fait partie de la section Architecture de jeu dans Unity du Journey Unity de Coddy. Leçon 3 sur 64.

Certaines classes de base décrivent un type de chose qui n’existe jamais par elle-même. Chaque arme tire, mais une arme qui n’est ni un pistolet ni un fusil à pompe n’a aucun moyen de tirer. Marquez une telle classe avec abstract et déclarez chaque étape que ses sous-classes doivent écrire comme une méthode abstraite, sans corps :

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);
        }
    }
}

Une sous-classe qui n’écrit pas Fire ne compile pas : CS0534, 'Pistol' does not implement inherited abstract member 'Weapon.Fire()'. Unity refuse également d’ajouter un script abstrait à un objet. Faites glisser Weapon sur un objet et Unity affiche Can't add script behaviour 'Weapon'. The script class can't be abstract!, car Unity ne pourrait pas créer une arme sans Fire.

Les autres scripts fonctionnent toujours avec le type de base. GetComponent<Weapon>() renvoie la sous-classe présente sur l’objet, et Pull() exécute le Fire de cette sous-classe :

// Player.cs
private Weapon weapon;

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

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

Remplacez le composant Shotgun par un Pistol et le script Player reste identique.

challenge icon

Défi

Facile

Rends Monster abstraite et fais en sorte que la tour électrocute tous les types de monstres.

  1. Dans Monster, écris public abstract class Monster et protected abstract void React();, sans corps.
  2. Le compilateur pointe maintenant vers Imp : ajoute protected override void React(), qui ajoute Vector3.forward * 2f à sa position.
  3. Dans Tower, à l’intérieur de la boucle, appelle Zap() sur target.GetComponent<Monster>().

Appuie sur « Jouer », puis sur la barre d’espace : les slimes rétrécissent et l’imp saute en arrière. Ensuite, appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

// Ce que tous les monstres ont en commun.
public class Monster : MonoBehaviour
{
    public int hp = 3;

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

    // Comment ce type de monstre réagit à un coup de zap auquel il survit.
    protected virtual void React()
    {
    }
}

Toutes les leçons de Architecture de jeu dans Unity

Entraînez-vous par vous-même : Playground Unity