Menu
CoddyTech

Trova un bersaglio

Lezione 7 di 18 del corso Gioco Unity: difesa della torre 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
  1. In Enemy, aggiungi public static readonly List<Enemy> All, un nuovo elenco. Ogni nemico si aggiunge in OnEnable e si rimuove in OnDisable.
  2. In Tower, aggiungi un float pubblico range (il prefab ArrowTower imposta 4.5) e un Enemy privato target.
  3. A ogni fotogramma, imposta target sul nemico in Enemy.All più vicino alla torre, purché si trovi entro range. Se non ci sono nemici nel raggio, target è null.

Per ora la torre non fa nulla con il suo bersaglio: la prossima lezione la farà ruotare per puntargli contro. Premi Play, costruisci una torre accanto al percorso, poi Check.

Provalo tu

using UnityEngine;

public class Tower : MonoBehaviour
{
    public int cost = 50;
}
quiz iconMettiti alla prova

Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.

Tutte le lezioni di Gioco Unity: difesa della torre