Menu
CoddyTech

Un script de base pour les ennemis

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

Les ennemis partagent la majeure partie de leur code : des points de vie, une vitesse, une façon de se déplacer. Ce code peut se trouver dans une classe de base qui dérive de MonoBehaviour, et chaque type d’ennemi en dérive. Cet Enemy définit ses points de vie dans Start et avance dans la direction où il regarde dans Update, tandis qu’un Ghost modifie le démarrage pour se déplacer deux fois plus vite :

public class Enemy : MonoBehaviour
{
    public int maxHp = 3;
    public float speed = 2f;
    protected int hp;

    protected virtual void Start()
    {
        hp = maxHp;
    }

    protected virtual void Update()
    {
        transform.Translate(Vector3.forward * speed * Time.deltaTime);
    }
}
public class Ghost : Enemy
{
    protected override void Start()
    {
        base.Start();
        speed *= 2f;
    }
}

Ghost hérite des champs : l’Inspector affiche donc maxHp et speed sur un Ghost. Il hérite aussi de Update et avance donc sans avoir son propre Update. hp est protected : Enemy et ses sous-classes peuvent l’utiliser, mais pas les autres scripts.

Unity repère Start et Update par leur nom, quel que soit leur niveau d’accès, et appelle celui de la classe la plus dérivée. Si le Start d’Enemy était un void Start() privé et que Ghost déclarait le sien, Unity n’appellerait que celui de Ghost : celui d’Enemy ne s’exécuterait jamais et hp resterait à 0 sans aucune erreur. Déclarer les messages de la classe de base protected virtual rend cela explicite en C# : la sous-classe écrit override, et base.Start() exécute la partie de la classe de base à l’endroit où vous l’appelez. Omettez cet appel et la partie de la classe de base sera ignorée : c’est ainsi qu’une sous-classe remplace une étape au lieu de s’y ajouter.

challenge icon

Défi

Facile

Les monstres marchent sur le château. Enemy.cs contient ce qu’ils ont en commun : Start définit hp sur maxHp et mémorise spawnPoint, et Update fait avancer le monstre le long de l’axe z à la vitesse speed. Le Grunt est un Enemy ordinaire et fonctionne. Deux types ajoutent leur propre étape, mais chacun perd la partie d’Enemy :

  • Golem : son Start fait grandir le golem jusqu’à 1.5 fois sa taille et consigne The golem wakes up, mais ses hp restent à 0, car Unity exécute le Start de Golem et jamais celui d’Enemy.
  • Wasp : son Update le fait osciller de 1 unité de chaque côté de spawnPoint.x, mais il zigzague sur place, car Unity exécute le Update de Wasp et jamais celui d’Enemy.

Définis le Start et le Update d’Enemy comme protected virtual, puis redéfinis-les dans Golem et Wasp afin que chacun exécute d’abord la partie d’Enemy, puis la sienne. Appuie sur Jouer, puis sur Vérifier.

Essayez vous-même

using UnityEngine;

// Ce que tous les monstres ont en commun.
public class Enemy : MonoBehaviour
{
    public int maxHp = 4;
    public float speed = 1.5f;

    protected int hp;
    protected Vector3 spawnPoint;

    void Start()
    {
        hp = maxHp;
        spawnPoint = transform.position;
    }

    void Update()
    {
        // avance vers le château, le long de l’axe z dans le sens négatif
        transform.position += Vector3.back * speed * Time.deltaTime;
    }
}
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Architecture de jeu dans Unity