Menu
CoddyTech

Encontrar un objetivo

Lección 8 de 25 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

cada torre elige al enemigo más cercano que esté a su alcance.

  1. En Enemy, añade public static readonly List<Enemy> All = new List<Enemy>();; añade this en OnEnable y elimínalo en OnDisable.
  2. En Tower, añade public float range = 4f; y private Enemy target;.
  3. Cada fotograma, busca al enemigo más cercano de Enemy.All que esté dentro de range (o null), registra "Target: " + found.name cuando sea nuevo y guárdalo en target.

Pulsa «Jugar» y construye junto al camino: la consola muestra el nombre de cada nuevo objetivo. Después, pulsa «Comprobar».

Pruébalo tú mismo

using UnityEngine;

// Más adelante: una torre encuentra a un enemigo dentro de su alcance, gira hacia él y dispara.
public class Tower : MonoBehaviour
{
}

Todas las lecciones de Juego de Unity: Defensa de torres

Practica por tu cuenta: Playground de Unity