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.Défi
MoyenChaque tour choisit l’ennemi le plus proche à portée.
- Dans
Enemy, ajoutepublic static readonly List<Enemy> All = new List<Enemy>();; ajoutethisdansOnEnable, supprime-le dansOnDisable. - Dans
Tower, ajoutepublic float range = 4f;etprivate Enemy target;. - À chaque image, trouve l’ennemi le plus proche dans
Enemy.Allà portée derange(ou null), affiche"Target: " + found.namedans les journaux lorsqu’il est nouveau, et conserve-le danstarget.
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