Encontrar um alvo
Lição 7 de 18 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édio- Em
Enemy, adicionepublic static readonly List<Enemy> All, uma nova lista. Cada inimigo se adiciona a ela emOnEnablee se remove emOnDisable. - Em
Tower, adicione um float públicorange(o prefab ArrowTower define 4.5) e um Enemy privadotarget. - A cada quadro, defina
targetcomo o inimigo emEnemy.Allmais próximo da torre, desde que esteja dentro derange. Sem nenhum inimigo no alcance,targeté null.
A torre ainda não faz nada com seu alvo: a próxima lição fará com que ela fique voltada para ele. Pressione Play, construa uma torre ao lado do caminho e, em seguida, Check.
Experimente você mesmo
using UnityEngine;
public class Tower : MonoBehaviour
{
public int cost = 50;
}
Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.