Menu
CoddyTech

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.

challenge icon

Tantangan

Sedang

Peluru meriam meledak dan melukai setiap musuh di dekatnya.

  1. Di TowerData, tambahkan public float splashRadius; (CannonData menetapkan 1.5). Launch menerima argumen ketiga, TowerData data, yang diteruskan oleh Tower.
  2. Saat tiba, jika data.splashRadius > 0, setiap IDamageable dalam Physics.OverlapSphere(transform.position, data.splashRadius) menerima kerusakan satu kali, jika tidak, hanya target yang menerima kerusakan.
  3. Lalu tampilkan blastPrefab yang diserialisasi di sana, dengan skala Vector3.one * data.splashRadius * 2f, dan Destroy(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