Menu
CoddyTech

Alan Hasarı

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 20 / 25.

Cannon'ın mermisi düştüğü yerde patlar ve yalnızca hedefini değil, patlamanın yakınındaki tüm düşmanları yaralar. Physics.OverlapSphere(center, radius), center noktasından radius uzaklığı içindeki tüm çarpıştırıcıları döndürür: düşmanları, ayrıca zemini ve yolu da. IDamageable bileşenine sahip her çarpıştırıcı hasar alır. Mermi hedefin üzerine düştüğü için hedef de bunlardan biridir; dolayısıyla kendi başına ikinci kez yaralanmamalıdır. Etrafındaki tüm kasaları geri savuran bir bomba:

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

Patlama yarıçapı Cannon'ın verisidir; bu yüzden merminin artık bir hasar değerinden fazlasına ihtiyacı var: Launch, kulenin TowerData'sını da alır. Arrow'un patlama yarıçapı 0'dır, bu yüzden atışları yalnızca hedeflerini vurmaya devam eder. Hasar ayrı bir argüman olarak kalır, çünkü kulenin seviyesine bağlıdır.

Patlama, merminin nerede infilak ettiğini oyuncuya gösterir: patlama alanı kadar geniş, içi görünen bir küre; saniyenin dörtte biri sonra kaybolur. Destroy(blast, 0.25f), senin ayrıca bir zamanlayıcı oluşturmana gerek kalmadan, bu gecikmenin ardından nesneyi yok eder.

challenge icon

Görev

Orta

Top mermileri patlayarak yakındaki her düşmana hasar verir.

  1. TowerData içine public float splashRadius; ekleyin (CannonData değeri 1.5 olarak ayarlar). Launch üçüncü bir bağımsız değişken alır: TowerData data; bunu Tower iletir.
  2. Hedefe ulaştığında, data.splashRadius > 0 ise Physics.OverlapSphere(transform.position, data.splashRadius) içindeki her IDamageable bir kez hasar alır; aksi hâlde yalnızca hedef hasar alır.
  3. Ardından orada serileştirilmiş bir blastPrefab gösterin; ölçeği Vector3.one * data.splashRadius * 2f olsun ve Destroy(blast, 0.25f) çağrısını yapın.

“Oyna” düğmesine basın: Cannon patlaması bir araya toplanmış Grunt'lara hasar verir. Ardından “Kontrol et” düğmesine basın.

Kendin dene

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

Unity Oyunu: Kule Savunması bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground