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.Desafío
Intermediocada torre elige al enemigo más cercano que esté a su alcance.
- En
Enemy, añadepublic static readonly List<Enemy> All = new List<Enemy>();; añadethisenOnEnabley elimínalo enOnDisable. - En
Tower, añadepublic float range = 4f;yprivate Enemy target;. - Cada fotograma, busca al enemigo más cercano de
Enemy.Allque esté dentro derange(o null), registra"Target: " + found.namecuando sea nuevo y guárdalo entarget.
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
2Torres
Construir plataformasPractica por tu cuenta: Playground de Unity