Menu
CoddyTech

Olaylar UI'ı Yönlendirir

Coddy'nin Unity Journey'sinin Unity'de Oyun Mimarisi bölümünün bir parçası. Ders 15 / 64.

Olaylar sayesinde HUD oyunu takip ederken oyun HUD hakkında hiçbir şey bilmez. Health, can puanlarını yönetir ve iki şeyi bildirir: can değişti ve 0'a ulaştı. Çubuk, metin veya oyun bitti ekranı için bir alanı yoktur; bu nedenle aynı bileşen oyuncuda, HUD'u olmayan bir düşmanda ve bir test sahnesinde çalışır:

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, HUD üzerinde
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;
}

Çubuk, OnEnable ve OnDisable ikilisiyle yalnızca etkin olduğu sırada dinler. Olay her iki sayıyı da iletir; bu nedenle Show için Health'ten başka bir şeye gerek yoktur. GameOverScreen, panelini göstermek için OnDied olayına; bir hasar sesi de OnChanged olayına abone olur. Her biri kendi betiğindedir ve Health bunların hiçbiri için değişmez. Hp { get; private set; }, HUD'un canı okumasına ama değiştirememesine olanak tanır.

Bir olay değişiklikleri bildirir; dolayısıyla ilk darbeden önce çubuk hiçbir şey duymamıştır. Mevcut canı Start sırasında bir kez çizer. OnEnable sırasında değil: Unity, Awake'i ve ardından OnEnable'ı nesneleri tek tek işlerken çağırır ve çağrı sırası garanti edilmez. Bu nedenle çubuğun OnEnable'ı, Health'in Hp değerini ayarlayan Awake'inden önce çalışabilir ve çubuk 0 gösterir. Herhangi bir Start çalıştığında ise tüm Awake çağrıları tamamlanmış olur.

challenge icon

Görev

Kolay

Silahın değişikliklerini bildirmesini ve HUD'ın bunları dinlemesini sağla.

  1. Gun.cs içinde using System;, public event Action<int, int> OnAmmoChanged ve public event Action<bool> OnReloading ekle; bunları yorumlarda belirtilen yerlerde tetikle.
  2. AmmoHud.cs içinde OnEnable sırasında abone ol, OnDisable sırasında abonelikten çık: ammoText, Ammo: 4/6 değerini gösterir; reloadText ise yalnızca yeniden doldurulurken görünür.
  3. Start içinde gun.Ammo ve gun.Reloading değerlerini bir kez çiz.

“Oyna”'ya bas ve silahın şarjörünü iki kez boşalt. Ardından “Kontrol et”'e bas.

Kendin dene

using UnityEngine;
using TMPro;

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

Unity'de Oyun Mimarisi bölümündeki tüm dersler

Kendi başına pratik yap: Unity playground