Menu
CoddyTech

Trouver une cible

Leçon 8 sur 25 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

Chaque tour choisit l’ennemi le plus proche à portée.

  1. Dans Enemy, ajoute public static readonly List<Enemy> All = new List<Enemy>(); ; ajoute this dans OnEnable, supprime-le dans OnDisable.
  2. Dans Tower, ajoute public float range = 4f; et private Enemy target;.
  3. À chaque image, trouve l’ennemi le plus proche dans Enemy.All à portée de range (ou null), affiche "Target: " + found.name dans les journaux lorsqu’il est nouveau, et conserve-le dans target.

Appuie sur « Jouer » et construis près du chemin : la Console indique le nom de chaque nouvelle cible. Puis appuie sur « Vérifier ».

Essayez vous-même

using UnityEngine;

// À venir : une tour repère un ennemi à portée, se tourne vers lui et tire.
public class Tower : MonoBehaviour
{
}

Toutes les leçons de Jeu Unity : défense de tours

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