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.Desafío
Intermedio- En
Enemy, añadepublic static readonly List<Enemy> All, una nueva lista. Cada enemigo se añade a sí mismo enOnEnabley se elimina enOnDisable. - En
Tower, añade un float públicorange(el prefab ArrowTower establece 4.5) y un Enemy privadotarget. - Cada frame, establece
targeten el enemigo deEnemy.Allmás cercano a la torre, siempre que esté dentro derange. Si no hay ningún enemigo dentro del alcance,targetes 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;
}
Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.