Menu
CoddyTech

Atak obszarowy

Lekcja 14 z 18 w kursie Gra Unity: Obrona wieżowa 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
  1. W TowerData dodaj publiczną zmienną typu float splashRadius: 0 oznacza brak obrażeń obszarowych. CannonData ustawia wartość 1.5.
  2. Zmień Projectile.Launch na Launch(Transform target, int damage, TowerData data) i zachowaj dane. W Tower przekaż dane wieży.
  3. Po dotarciu, gdy promień obrażeń obszarowych określony w danych jest większy od 0, każdy collider w tym promieniu od miejsca trafienia, który ma IDamageable, otrzymuje obrażenia; cel również, tylko raz. Następnie pokaż wybuch: utwórz instancję serializowanego blastPrefab (GameObject) w miejscu trafienia, przeskaluj go do Vector3.one * data.splashRadius * 2f i zniszcz po 0.25 sekundy. Gdy nie ma obrażeń obszarowych, obrażenia otrzymuje tylko cel, jak wcześniej.

Prefab CannonBall ma Blast w swoim blastPrefab. Naciśnij Play, umieść Cannon tam, gdzie gromadzą się przeciwnicy, a następnie kliknij Check.

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);
        }
    }
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Gra Unity: Obrona wieżowa