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.Sfida
Medio- In
Enemy, aggiungipublic static readonly List<Enemy> All, un nuovo elenco. Ogni nemico si aggiunge inOnEnablee si rimuove inOnDisable. - In
Tower, aggiungi un float pubblicorange(il prefab ArrowTower imposta 4.5) e un Enemy privatotarget. - A ogni fotogramma, imposta
targetsul nemico inEnemy.Allpiù vicino alla torre, purché si trovi entrorange. 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;
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.