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.
Sfida
MedioLe palle di cannone esplodono e danneggiano ogni nemico nelle vicinanze.
- In
TowerData, aggiungipublic float splashRadius;(CannonData imposta 1.5).Launchaccetta un terzo argomento,TowerData data, che la Torre passa. - All'arrivo, se
data.splashRadius > 0, ogni IDamageable inPhysics.OverlapSphere(transform.position, data.splashRadius)subisce i danni una volta; altrimenti, solo il bersaglio. - Poi mostra lì un
blastPrefabserializzato, con scalaVector3.one * data.splashRadius * 2f, eDestroy(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