Menu
CoddyTech

Obrażenia obszarowe

Lekcja 20 z 25 w kursie Gra w Unity: Obrona wieży w Coddy.

Pocisk działa Cannon eksploduje w miejscu lądowania i rani każdego wroga w pobliżu wybuchu, nie tylko swój cel. Physics.OverlapSphere(center, radius) zwraca każdy collider w odległości radius od center: wrogów, ale też podłoże i ścieżkę. Każdy collider, który ma IDamageable, otrzymuje obrażenia. Cel jest jednym z nich, ponieważ pocisk ląduje na nim, więc nie może otrzymać obrażeń po raz drugi osobno. Bomba, która odrzuca wszystkie skrzynie wokół siebie:

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

Promień rażenia to dana działa Cannon, więc pocisk potrzebuje teraz czegoś więcej niż tylko wartości obrażeń: Launch przyjmuje także TowerData wieży. Promień rażenia strzały Arrow wynosi 0, więc jej pociski nadal trafiają tylko w swój cel. Obrażenia pozostają osobnym argumentem, ponieważ zależą od poziomu wieży.

Wybuch pokazuje graczowi, gdzie eksplodował pocisk: przezroczysta kula o szerokości równej promieniowi rażenia, która znika po ćwierci sekundy. Destroy(blast, 0.25f) niszczy ją po tym czasie, bez potrzeby używania własnego timera.

challenge icon

Wyzwanie

Średni

Pociski armatnie eksplodują i ranią każdego pobliskiego wroga.

  1. W TowerData dodaj public float splashRadius; (CannonData ustawia wartość 1.5). Launch przyjmuje trzeci argument, TowerData data, który przekazuje wieża.
  2. Po dotarciu, gdy data.splashRadius > 0, każdy obiekt IDamageable w Physics.OverlapSphere(transform.position, data.splashRadius) otrzymuje obrażenia jeden raz; w przeciwnym razie obrażenia otrzymuje tylko cel.
  3. Następnie wyświetl w tym miejscu serializowany blastPrefab, przeskalowany do Vector3.one * data.splashRadius * 2f, i wykonaj Destroy(blast, 0.25f).

Naciśnij „Graj”: eksplozja działa Cannon rani skupionych Gruntów. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

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

Wszystkie lekcje w sekcji Gra w Unity: Obrona wieży

Poćwicz samodzielnie: Edytor online Unity