Danno ad area
Lezione 14 di 18 del corso Gioco Unity: difesa della torre di Coddy.
Il proiettile del Cannone esplode nel punto in cui atterra e danneggia tutti i nemici vicini all'esplosione, non solo il suo bersaglio. Physics.OverlapSphere(center, radius) restituisce tutti i collider entro radius da center: i nemici, ma anche il terreno e il percorso. Ogni collider che ha un IDamageable subisce i danni. Il bersaglio è uno di questi, poiché il proiettile gli atterra addosso, quindi non deve essere danneggiato una seconda volta da solo. Una bomba che respinge tutte le casse che ha intorno:
void Explode()
{
foreach (Collider other in Physics.OverlapSphere(transform.position, blastRadius))
{
if (other.TryGetComponent(out Rigidbody body))
{
Vector3 away = (body.position - transform.position).normalized;
body.AddForce(away * push, ForceMode.Impulse);
}
}
}Il raggio dell'esplosione è un dato del Cannone, quindi ora un proiettile ha bisogno di più di un valore di danno: Launch riceve anche il TowerData della torre. Il raggio dell'esplosione di una Freccia è 0, quindi i suoi colpi continuano a colpire solo il loro bersaglio. Il danno resta un argomento separato, poiché dipende dal livello della torre.
Un'esplosione mostra al giocatore dove è scoppiato il proiettile: una sfera trasparente larga quanto il raggio dell'esplosione, che scompare dopo un quarto di secondo. Destroy(blast, 0.25f) la distrugge dopo quel ritardo, senza bisogno di un timer apposito.
Sfida
Medio- In
TowerData, aggiungi un float pubblicosplashRadius: 0 significa nessun danno ad area. CannonData imposta 1.5. - Modifica
Projectile.LaunchinLaunch(Transform target, int damage, TowerData data)e conserva i dati. InTower, passa i dati della torre. - All’arrivo, quando il raggio dell’area d’effetto dei dati è maggiore di 0, ogni collider entro quel raggio dal punto d’impatto che ha un IDamageable subisce il danno, incluso il bersaglio, una sola volta. Poi mostra l’esplosione: istanzia un
blastPrefabserializzato (un GameObject) nel punto d’impatto, ridimensionalo aVector3.one * data.splashRadius * 2fe distruggilo dopo 0.25 secondi. Senza danno ad area, viene colpito solo il bersaglio, come prima.
Il prefab CannonBall ha l’esplosione nel suo blastPrefab. Premi Gioca, posiziona un Cannon dove i nemici si ammassano, poi premi Verifica.
Provalo tu
using UnityEngine;
public class Projectile : MonoBehaviour
{
[SerializeField] private float speed = 12f;
private Transform target;
private int damage;
public void Launch(Transform target, int damage)
{
this.target = target;
this.damage = damage;
}
void Update()
{
if (target == null)
{
Destroy(gameObject);
return;
}
transform.position = Vector3.MoveTowards(transform.position, target.position, speed * Time.deltaTime);
if (transform.position == target.position)
{
if (target.TryGetComponent(out IDamageable damageable))
{
damageable.TakeDamage(damage);
}
Destroy(gameObject);
}
}
}
Questa lezione include un breve quiz. Inizia la lezione per rispondere e tenere traccia dei tuoi progressi.