Menu
CoddyTech

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.

challenge icon

Sfida

Medio
  1. In TowerData, aggiungi un float pubblico splashRadius: 0 significa nessun danno ad area. CannonData imposta 1.5.
  2. Modifica Projectile.Launch in Launch(Transform target, int damage, TowerData data) e conserva i dati. In Tower, passa i dati della torre.
  3. 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 blastPrefab serializzato (un GameObject) nel punto d’impatto, ridimensionalo a Vector3.one * data.splashRadius * 2f e 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);
        }
    }
}
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