Menu
CoddyTech

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

Desafio

Médio

Cada torre escolhe o inimigo mais próximo dentro do alcance.

  1. Em Enemy, adicione public static readonly List<Enemy> All = new List<Enemy>();; adicione this em OnEnable e remova-o em OnDisable.
  2. Em Tower, adicione public float range = 4f; e private Enemy target;.
  3. A cada frame, encontre o inimigo mais próximo em Enemy.All dentro de range (ou null), registre "Target: " + found.name quando ele for novo e mantenha-o em target.

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