Menu
CoddyTech

Trova un bersaglio

Lezione 8 di 25 del corso Gioco Unity: Tower Defense di Coddy.

Una torre spara al nemico più vicino, purché quel nemico si trovi entro la range della torre. Per scegliere, la torre ha bisogno di conoscere tutti i nemici presenti sulla mappa. FindObjectsByType<Enemy> cercherebbe ogni fotogramma nell'intera scena per ogni torre, quindi, invece, i nemici tengono un elenco di sé stessi: un elenco statico nella classe Enemy, a cui ogni nemico si aggiunge in OnEnable e da cui si rimuove in OnDisable. Unity chiama OnDisable su un oggetto che sta per essere distrutto, quindi anche un nemico sconfitto lascia l'elenco. Anche gli oggetti da raccogliere in un gioco possono fare lo stesso:

public class Pickup : MonoBehaviour
{
    public static readonly List<Pickup> All = new List<Pickup>();

    void OnEnable()
    {
        All.Add(this);
    }

    void OnDisable()
    {
        All.Remove(this);
    }
}

Trovare il più vicino richiede un ciclo che ricorda il migliore trovato finora. Una calamita che attira l'oggetto da raccogliere più vicino entro pullRange inizia senza alcun oggetto e con l'intervallo come distanza migliore, così un oggetto più lontano non potrà mai vincere:

Pickup best = null;
float bestDistance = pullRange;
foreach (Pickup pickup in Pickup.All)
{
    // Più vicino del migliore finora? Conservalo insieme alla sua distanza
}
Vector3.Distance(a, b) restituisce la distanza tra due punti. Quando non c'è nulla entro l'intervallo, il ciclo non conserva nulla e il risultato è null.
challenge icon

Sfida

Medio

Ogni torre sceglie il nemico più vicino nel raggio d’azione.

  1. In Enemy, aggiungi public static readonly List<Enemy> All = new List<Enemy>();; aggiungi this in OnEnable, rimuovilo in OnDisable.
  2. In Tower, aggiungi public float range = 4f; e private Enemy target;.
  3. A ogni fotogramma, trova il nemico più vicino in Enemy.All entro range (o null), registra "Target: " + found.name quando è nuovo e mantienilo in target.

Premi «Gioca» e costruisci vicino al percorso: la Console mostra il nome di ogni nuovo bersaglio. Poi premi «Verifica».

Provalo tu

using UnityEngine;

// Più avanti: una torre individua un nemico nel suo raggio d'azione, si gira verso di lui e spara.
public class Tower : MonoBehaviour
{
}

Tutte le lezioni di Gioco Unity: Tower Defense

Esercitati da solo: Playground Unity