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.
Görev
OrtaTowerDataiçinde herkese açık bir floatsplashRadiusekle: 0, alan hasarı olmadığı anlamına gelir. CannonData 1.5 ayarlar.Projectile.LaunchmetodunuLaunch(Transform target, int damage, TowerData data)olarak değiştir ve veriyi sakla.Toweriçinde kulenin verisini ilet.- 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ğiniVector3.one * data.splashRadius * 2fyap 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);
}
}
}
Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.