Encontre um Alvo
Lição 8 de 25 do curso Jogo de Unity: Defesa de Torres da Coddy.
Uma torre atira no inimigo mais próximo dela, desde que esse inimigo esteja dentro do range da torre. Para escolher, a torre precisa de todos os inimigos no tabuleiro. FindObjectsByType<Enemy> pesquisaria a cena inteira a cada quadro para cada torre, então, em vez disso, os inimigos mantêm uma lista deles: uma lista estática na classe Enemy, à qual cada inimigo é adicionado em OnEnable e da qual sai em OnDisable. O Unity chama OnDisable em um objeto que está sendo destruído, então um inimigo morto também sai da lista. Coletas em um jogo podem fazer o mesmo:
public class Pickup : MonoBehaviour
{
public static readonly List<Pickup> All = new List<Pickup>();
void OnEnable()
{
All.Add(this);
}
void OnDisable()
{
All.Remove(this);
}
}Encontrar o mais próximo é um loop que guarda o melhor até então. Um ímã que puxa a coleta mais próxima dentro de pullRange começa sem nenhuma coleta e com o alcance como a melhor distância, então uma coleta mais distante nunca pode vencer:
Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
// mais perto do que o melhor até agora? guarde-o e a distância dele
}Vector3.Distance(a, b) fornece a distância entre dois pontos. Quando nada está dentro do alcance, o loop não guarda nada, e a resposta é null.Desafio
MédioCada torre escolhe o inimigo mais próximo dentro do alcance.
- Em
Enemy, adicionepublic static readonly List<Enemy> All = new List<Enemy>();; adicionethisemOnEnablee remova-o emOnDisable. - Em
Tower, adicionepublic float range = 4f;eprivate Enemy target;. - A cada frame, encontre o inimigo mais próximo em
Enemy.Alldentro derange(ou null), registre"Target: " + found.namequando ele for novo e mantenha-o emtarget.
Pressione “Jogar” e construa perto do caminho: o Console mostra o nome de cada novo alvo. Depois, “Verificar”.
Experimente você mesmo
using UnityEngine;
// Vem depois: uma torre encontra um inimigo ao seu alcance, vira-se para ele e dispara.
public class Tower : MonoBehaviour
{
}
Todas as lições de Jogo de Unity: Defesa de Torres
Pratique por conta própria: Playground de Unity