Menu
CoddyTech

Trouver une cible

Leçon 7 sur 18 du cours Jeu Unity : défense de tours de Coddy.

Une tour tire sur l’ennemi le plus proche d’elle, tant que cet ennemi se trouve dans la range de la tour. Pour choisir, la tour a besoin de connaître tous les ennemis présents sur le plateau. FindObjectsByType<Enemy> rechercherait dans toute la scène à chaque image pour chaque tour ; les ennemis tiennent donc plutôt une liste d’eux-mêmes : une liste statique dans la classe Enemy, que chaque ennemi rejoint dans OnEnable et quitte dans OnDisable. Unity appelle OnDisable sur un objet en cours de destruction, donc un ennemi mort quitte lui aussi la liste. Les objets à ramasser dans un jeu peuvent faire de même :

public class Pickup : MonoBehaviour
{
    public static readonly List<Pickup> All = new List<Pickup>();

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }
}

Trouver le plus proche consiste à parcourir la liste en mémorisant le meilleur résultat obtenu jusque-là. Un aimant qui attire l’objet à ramasser le plus proche dans une portée de pullRange commence sans objet à ramasser et avec la portée comme meilleure distance, de sorte qu’un objet plus éloigné ne peut jamais être retenu :

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // plus proche que le meilleur jusqu’ici ? garde-le, ainsi que sa distance
}
Vector3.Distance(a, b) donne la distance entre deux points. Si aucun objet ne se trouve dans la portée, la boucle ne retient rien et le résultat est null.
challenge icon

Défi

Moyen
  1. Dans Enemy, ajoute public static readonly List<Enemy> All, une nouvelle liste. Chaque ennemi s’ajoute dans OnEnable et se retire dans OnDisable.
  2. Dans Tower, ajoute un float public range (le prefab ArrowTower définit 4.5) et un Enemy privé target.
  3. À chaque image, définis target sur l’ennemi de Enemy.All le plus proche de la tour, à condition qu’il soit dans range. S’il n’y a aucun ennemi à portée, target est null.

La tour ne fait encore rien avec sa cible : la prochaine leçon lui apprendra à se tourner vers elle. Appuie sur Play, construis une tour près du chemin, puis clique sur Check.

Essayez vous-même

using UnityEngine;

public class Tower : MonoBehaviour
{
    public int cost = 50;
}
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 Jeu Unity : défense de tours