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.
Tantangan
MudahSebuah 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 danmaxAmmo(dua int), sertaOnReloading, 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.ammoTextmenampilkan jumlah amunisi sebagaiAmmo: 4/6, danreloadText(object dengan teksReloading...) hanya ditampilkan selama pengisian ulang. - HUD menampilkan nilai yang benar sejak awal, sebelum tembakan pertama:
Ammo: 6/6dan tanpa teks pengisian ulang. PropertyAmmodanReloadingmilik 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;
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Arsitektur Game di Unity
1Komponen, Bukan Hierarki
Komponen KecilSkrip Dasar MusuhKomponen AbstrakKomponen yang Bekerja SamaRingkasan: Turret Modular5ScriptableObjects
Aset DataStatistik SenjataPengaturan BersamaGelombang sebagai DataUlasan: database Item8Kode yang Dapat Digunakan Kembali
Extension methodSingleton GenerikHelper GenerikUlasan: FindNearest3Event
Event C# di UnityBerlangganan di OnEnableField UnityEventEvent Menggerakkan UIRingkasan: Popup Pencapaian