Menu
CoddyTech

Ad area

Lezione 20 di 25 del corso Gioco Unity: Tower Defense 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

Le palle di cannone esplodono e danneggiano ogni nemico nelle vicinanze.

  1. In TowerData, aggiungi public float splashRadius; (CannonData imposta 1.5). Launch accetta un terzo argomento, TowerData data, che la Torre passa.
  2. All'arrivo, se data.splashRadius > 0, ogni IDamageable in Physics.OverlapSphere(transform.position, data.splashRadius) subisce i danni una volta; altrimenti, solo il bersaglio.
  3. Poi mostra lì un blastPrefab serializzato, con scala Vector3.one * data.splashRadius * 2f, e Destroy(blast, 0.25f).

Premi «Gioca»: l'esplosione di un Cannon danneggia i Grunt raggruppati. 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);
        }
    }
}

Tutte le lezioni di Gioco Unity: Tower Defense

Esercitati da solo: Playground Unity