Menu
CoddyTech

Daño en área

Lección 20 de 25 del curso Juego de Unity: Defensa de torres de Coddy.

El proyectil del Cañón estalla donde aterriza y daña a todos los enemigos cercanos a la explosión, no solo a su objetivo. Physics.OverlapSphere(center, radius) devuelve todos los colisionadores que están a una distancia de radius de center: enemigos, pero también el suelo y el camino. Cada colisionador que tenga un IDamageable recibe el daño. El objetivo es uno de ellos, ya que el proyectil aterriza sobre él, así que no debe recibir daño por segunda vez por su cuenta. Una bomba que empuja hacia atrás todas las cajas cercanas:

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);
        }
    }
}

El radio de explosión es un dato del Cañón, así que ahora un proyectil necesita más que un número de daño: Launch también recibe el TowerData de la torre. El radio de explosión de una Flecha es 0, así que sus disparos siguen impactando solo a su objetivo. El daño sigue siendo un argumento independiente, ya que depende del nivel de la torre.

Una explosión le muestra al jugador dónde estalló el proyectil: una esfera transparente tan amplia como el radio de explosión, que desaparece al cabo de un cuarto de segundo. Destroy(blast, 0.25f) la destruye después de esa demora, sin necesidad de que crees tu propio temporizador.

challenge icon

Desafío

Intermedio

Los proyectiles de cañón explotan e hieren a todos los enemigos cercanos.

  1. En TowerData, añade public float splashRadius; (CannonData establece 1.5). Launch recibe un tercer argumento, TowerData data, que le pasa Tower.
  2. Al llegar, si data.splashRadius > 0, cada IDamageable dentro de Physics.OverlapSphere(transform.position, data.splashRadius) recibe el daño una vez; de lo contrario, solo el objetivo.
  3. Después, muestra allí un blastPrefab serializado, escalado a Vector3.one * data.splashRadius * 2f, y Destroy(blast, 0.25f).

Pulsa «Jugar»: una explosión de cañón hiere a los Grunts agrupados. Después, pulsa «Comprobar».

Pruébalo tú mismo

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);
        }
    }
}

Todas las lecciones de Juego de Unity: Defensa de torres

Practica por tu cuenta: Playground de Unity