Menu
CoddyTech

Capai Markas

Pelajaran 3 dari 18 dalam kursus Game Unity: Tower Defense di Coddy.

Musuh yang berjalan ke waypoint terakhir telah mencapai markas: pemain kehilangan nyawa dan musuh itu pergi. Nyawa dikelola oleh GameManager, yang menampilkannya di layar. Musuh tidak perlu memiliki referensi ke GameManager untuk melaporkannya: sebentar lagi musuh dibuat dalam jumlah banyak dari prefab, dan prefab tidak dapat menunjuk ke object di scene.

Event static menyelesaikan keduanya. Event ini milik class Enemy, bukan milik satu musuh, sehingga GameManager cukup berlangganan sekali dan menerima kabar dari setiap musuh, termasuk musuh yang dibuat kemudian. Setiap musuh memicunya dengan dirinya sendiri sebagai argumen, sehingga pendengar dapat mengetahui jenis musuh yang berhasil melewatinya. Koin dalam game platformer melaporkannya dengan cara yang sama:

public class Coin : MonoBehaviour
{
    public static event Action<Coin> Collected;
    public int value = 1;

    void OnTriggerEnter(Collider other)
    {
        Collected?.Invoke(this);
        Destroy(gameObject);
    }
}
// ScoreBoard.cs
void OnEnable()
{
    Coin.Collected += AddCoin;
}

void OnDisable()
{
    Coin.Collected -= AddCoin;
}

void AddCoin(Coin coin)
{
    score += coin.value;
}

Event static tetap ada selama game berjalan, jadi -= lebih penting dari sebelumnya: ScoreBoard yang dihancurkan tetapi tidak pernah berhenti berlangganan akan tetap dipanggil, dan kodenya akan gagal saat mengakses teksnya yang sudah dihancurkan. OnEnable dan OnDisable selalu berpasangan, jadi setiap += memiliki -=.

challenge icon

Tantangan

Mudah

Base membutuhkan nyawa, dan musuh yang mencapainya harus mengurangi nyawa tersebut.

  1. Di EnemyData, tambahkan damage bertipe int public: jumlah nyawa yang diambil jenis musuh ini dari base.
  2. Di Enemy, deklarasikan event static public ReachedBase yang meneruskan musuh (Action<Enemy>). Saat musuh tiba di waypoint terakhir, picu event tersebut dengan mengirimkan musuh itu sendiri, lalu hancurkan musuh, alih-alih berhenti di sana.
  3. Di GameManager, tambahkan int startLives yang diserialisasi (20) dan int lives private yang dimulai dari nilai tersebut. Berlangganan ke Enemy.ReachedBase di OnEnable dan berhenti berlangganan di OnDisable. Setiap musuh yang berhasil melewati jalur mengurangi nyawa sebanyak nilai damage pada asset-nya.
  4. Tampilkan jumlah nyawa dalam TMP_Text livesText yang diserialisasi, sebagai Lives: 20, saat mulai dan setelah setiap perubahan.

Game object memiliki GameManager, Inspector menghubungkan LivesText, dan kedua asset mengurangi 1 nyawa. Tekan Jalankan, tunggu sampai kedua musuh mencapai base, lalu tekan Periksa.

Coba sendiri

using UnityEngine;

public class Enemy : MonoBehaviour
{
    public EnemyData data;
    public Transform[] waypoints;

    private int next = 1;
    private int health;

    void Awake()
    {
        health = data.maxHealth;
    }

    void Update()
    {
        if (next >= waypoints.Length)
        {
            return;
        }

        Vector3 target = waypoints[next].position;
        transform.position = Vector3.MoveTowards(transform.position, target, data.speed * Time.deltaTime);
        if (transform.position == target)
        {
            next++;
        }
    }
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Game Unity: Tower Defense