Menu
CoddyTech

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.
challenge icon

Desafio

Médio
  1. Em Enemy, adicione public static readonly List<Enemy> All, uma nova lista. Cada inimigo se adiciona a ela em OnEnable e se remove em OnDisable.
  2. Em Tower, adicione um float público range (o prefab ArrowTower define 4.5) e um Enemy privado target.
  3. A cada quadro, defina target como o inimigo em Enemy.All mais próximo da torre, desde que esteja dentro de range. 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;
}
quiz iconTeste seus conhecimentos

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Jogo de Unity: Defesa de Torres