Menu
CoddyTech

Alan Hasarı

Coddy'nin Unity Oyunu: Kule Savunması kursunda ders 14 / 18.

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
  1. TowerData içinde herkese açık bir float splashRadius ekle: 0, alan hasarı olmadığı anlamına gelir. CannonData 1.5 ayarlar.
  2. Projectile.Launch metodunu Launch(Transform target, int damage, TowerData data) olarak değiştir ve veriyi sakla. Tower içinde kulenin verisini ilet.
  3. Varışta, verinin alan yarıçapı 0'dan büyükse, çarpma noktasının bu yarıçapı içindeki ve IDamageable bileşenine sahip her çarpışma nesnesi, hedef de dahil olmak üzere, hasarı bir kez alır. Ardından patlamayı göster: serileştirilmiş bir blastPrefab (bir GameObject) örneğini çarpma noktasında oluştur, ölçeğini Vector3.one * data.splashRadius * 2f yap ve 0.25 saniye sonra yok et. Alan hasarı yoksa, önceki gibi yalnızca hedef hasar alır.

CannonBall prefab'ında Blast, blastPrefab alanındadır. Play'e bas, düşmanların toplandığı yere bir Cannon yerleştir, ardından Check'e bas.

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);
        }
    }
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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