Menu
CoddyTech

Encontrar un objetivo

Lección 7 de 18 del curso Juego de Unity: defensa de torres de Coddy.

Una torre dispara al enemigo más cercano, siempre que ese enemigo esté dentro del range de la torre. Para elegir, la torre necesita conocer todos los enemigos del tablero. FindObjectsByType<Enemy> buscaría en toda la escena cada fotograma para cada torre, así que, en su lugar, los enemigos mantienen una lista de sí mismos: una lista estática en la clase Enemy, a la que cada enemigo se une en OnEnable y de la que sale en OnDisable. Unity llama a OnDisable en un objeto que se está destruyendo, así que un enemigo muerto también sale de la lista. Los objetos coleccionables de un juego pueden hacer lo mismo:

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

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

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

Encontrar el más cercano consiste en un bucle que recuerda cuál es el mejor hasta el momento. Un imán que atrae el objeto coleccionable más cercano dentro de pullRange empieza sin ningún objeto coleccionable y con el rango como la mejor distancia, así que un objeto coleccionable más lejano nunca podrá ser el elegido:

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // ¿Está más cerca que el mejor hasta ahora? Guárdalo junto con su distancia
}
Vector3.Distance(a, b) da la distancia entre dos puntos. Cuando no hay nada dentro del rango, el bucle no conserva nada y la respuesta es null.
challenge icon

Desafío

Intermedio
  1. En Enemy, añade public static readonly List<Enemy> All, una nueva lista. Cada enemigo se añade a sí mismo en OnEnable y se elimina en OnDisable.
  2. En Tower, añade un float público range (el prefab ArrowTower establece 4.5) y un Enemy privado target.
  3. Cada frame, establece target en el enemigo de Enemy.All más cercano a la torre, siempre que esté dentro de range. Si no hay ningún enemigo dentro del alcance, target es null.

La torre todavía no hace nada con su objetivo: la próxima lección hará que lo mire. Pulsa Play, construye una torre junto al camino y luego pulsa Check.

Pruébalo tú mismo

using UnityEngine;

public class Tower : MonoBehaviour
{
    public int cost = 50;
}
quiz iconPonte a prueba

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Juego de Unity: defensa de torres