Serangan Area
Pelajaran 20 dari 25 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
SedangPeluru meriam meledak dan melukai setiap musuh di dekatnya.
- Di
TowerData, tambahkanpublic float splashRadius;(CannonData menetapkan 1.5).Launchmenerima argumen ketiga,TowerData data, yang diteruskan oleh Tower. - Saat tiba, jika
data.splashRadius > 0, setiap IDamageable dalamPhysics.OverlapSphere(transform.position, data.splashRadius)menerima kerusakan satu kali, jika tidak, hanya target yang menerima kerusakan. - Lalu tampilkan
blastPrefabyang diserialisasi di sana, dengan skalaVector3.one * data.splashRadius * 2f, danDestroy(blast, 0.25f).
Tekan tombol “Main”: ledakan Cannon melukai Grunt yang bergerombol. Lalu tekan tombol “Periksa”.
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);
}
}
}
Semua pelajaran di Game Unity: Tower Defense
Latihan sendiri: Playground Unity