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.
Görev
OrtaTop mermileri patlayarak yakındaki her düşmana hasar verir.
TowerDataiçinepublic float splashRadius;ekleyin (CannonDatadeğeri 1.5 olarak ayarlar).Launchüçüncü bir bağımsız değişken alır:TowerData data; bunu Tower iletir.- Hedefe ulaştığında,
data.splashRadius > 0isePhysics.OverlapSphere(transform.position, data.splashRadius)içindeki her IDamageable bir kez hasar alır; aksi hâlde yalnızca hedef hasar alır. - Ardından orada serileştirilmiş bir
blastPrefabgösterin; ölçeğiVector3.one * data.splashRadius * 2folsun veDestroy(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