Serangan Area
Pelajaran 14 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.
Peluru meriam meledak saat mendarat dan melukai setiap musuh di dekat ledakan, bukan hanya sasarannya. Physics.OverlapSphere(center, radius) mengembalikan setiap collider dalam jarak radius dari center: musuh, tetapi juga tanah dan jalur. Setiap collider yang memiliki IDamageable menerima damage. Sasaran termasuk salah satunya karena peluru mendarat tepat di atasnya, jadi sasaran tidak boleh terkena damage untuk kedua kalinya. Sebuah bom yang mendorong semua peti di sekitarnya:
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);
}
}
}Radius ledakan adalah data milik meriam, jadi proyektil kini membutuhkan lebih dari sekadar angka damage: Launch juga menerima TowerData milik menara. Radius ledakan Arrow adalah 0, jadi tembakannya tetap hanya mengenai sasarannya. Damage tetap menjadi argumen terpisah karena nilainya bergantung pada level menara.
Ledakan menunjukkan kepada pemain tempat peluru meledak: sebuah bola tembus pandang selebar radius ledakan yang menghilang setelah seperempat detik. Destroy(blast, 0.25f) menghancurkannya setelah jeda itu, tanpa perlu timer sendiri.
Tantangan
Sedang- Di
TowerData, tambahkan float publiksplashRadius: nilai 0 berarti tidak ada efek area. CannonData menetapkan nilai 1.5. - Ubah
Projectile.LaunchmenjadiLaunch(Transform target, int damage, TowerData data)dan simpan datanya. DiTower, teruskan data tower. - Saat tiba, jika radius efek area data lebih dari 0, setiap collider dalam radius tersebut dari titik benturan yang memiliki IDamageable menerima damage, termasuk target, satu kali. Lalu tampilkan ledakannya: buat instance dari
blastPrefab(sebuah GameObject) yang diserialisasi di titik benturan, ubah skalanya menjadiVector3.one * data.splashRadius * 2fdan hancurkan setelah 0.25 detik. Tanpa efek area, hanya target yang terkena, seperti sebelumnya.
Prefab CannonBall memiliki Blast di blastPrefab-nya. Tekan Play, letakkan Cannon di tempat musuh berkumpul, lalu tekan Check.
Coba sendiri
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);
}
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.