Menu
CoddyTech

Event Menggerakkan UI

Termasuk bagian Arsitektur Game di Unity dalam perjalanan Unity di Coddy. Pelajaran 13 dari 50.

Dengan event, HUD mengikuti game, sementara game tidak mengetahui apa pun tentang HUD. Health memiliki hit point dan mengumumkan dua hal: health berubah, dan nilainya mencapai 0. Health tidak memiliki field untuk bar, teks, atau layar game over, sehingga component yang sama berfungsi pada player, enemy yang tidak memiliki HUD, dan scene pengujian:

public class Health : MonoBehaviour
{
    public int maxHp = 100;
    public event Action<int, int> OnChanged;
    public event Action OnDied;
    public int Hp { get; private set; }

    void Awake()
    {
        Hp = maxHp;
    }

    public void TakeDamage(int amount)
    {
        if (Hp == 0) return;
        Hp = Mathf.Max(Hp - amount, 0);
        OnChanged?.Invoke(Hp, maxHp);
        if (Hp == 0) OnDied?.Invoke();
    }
}
// HealthBar.cs, di HUD
public Health health;
public Image bar;

void OnEnable() { health.OnChanged += Show; }
void OnDisable() { health.OnChanged -= Show; }

void Start()
{
    Show(health.Hp, health.maxHp);
}

void Show(int hp, int max)
{
    bar.fillAmount = (float)hp / max;
}

Bar hanya mendengarkan saat aktif, menggunakan pasangan OnEnable dan OnDisable. Event meneruskan kedua angka, jadi Show tidak membutuhkan apa pun lagi dari Health. GameOverScreen berlangganan ke OnDied untuk menampilkan panelnya, dan suara terluka berlangganan ke OnChanged. Keduanya berada di script masing-masing, dan Health tidak perlu diubah untuk keduanya. Hp { get; private set; } memungkinkan HUD membaca health, tetapi tidak mengubahnya.

Event melaporkan perubahan, jadi sebelum terkena serangan pertama, bar belum menerima apa pun. Bar menggambar health saat ini satu kali, di Start. Bukan di OnEnable: Unity memanggil Awake lalu OnEnable untuk setiap object, tanpa urutan yang dijanjikan. Jadi, OnEnable milik bar dapat berjalan sebelum Awake milik Health menetapkan Hp, sehingga bar akan menampilkan 0. Saat Start mana pun berjalan, semua Awake sudah berjalan.

challenge icon

Tantangan

Mudah

Sebuah lapangan tembak. Tombol Space menembakkan senjata (Gun.cs), yang menampung maxAmmo (6) tembakan, dan menembakkan peluru terakhir akan memulai pengisian ulang selama reloadTime (1.5) detik hingga amunisi terisi kembali. HUD belum menampilkan semua ini. Buat senjata mengumumkan perubahannya dan HUD mendengarkannya. Senjata tidak mendapat field untuk HUD.

  • Di Gun.cs, tambahkan dua event publik: OnAmmoChanged, yang mengirimkan jumlah amunisi dan maxAmmo (dua int), serta OnReloading, yang mengirimkan bool: true saat pengisian ulang dimulai, false saat berakhir. Picu event tersebut di tempat yang ditunjukkan oleh komentar.
  • Di AmmoHud.cs (pada HUD), dengarkan kedua event selama HUD aktif. ammoText menampilkan jumlah amunisi sebagai Ammo: 4/6, dan reloadText (object dengan teks Reloading...) hanya ditampilkan selama pengisian ulang.
  • HUD menampilkan nilai yang benar sejak awal, sebelum tembakan pertama: Ammo: 6/6 dan tanpa teks pengisian ulang. Property Ammo dan Reloading milik senjata memberikan nilai terkini.
  • Jika HUD dihancurkan, senjata tetap menembak tanpa error.

Tekan Play, kosongkan amunisi senjata dua kali, lalu tekan Check.

Coba sendiri

using UnityEngine;
using TMPro;

public class AmmoHud : MonoBehaviour
{
    public Gun gun;
    public TMP_Text ammoText;
    public GameObject reloadText;
}
quiz iconUji dirimu

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

Semua pelajaran di Arsitektur Game di Unity