Menu
CoddyTech

Olaylar Arayüzü Yönlendirir

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

Olaylarla birlikte HUD oyunu takip ederken, oyun HUD hakkında hiçbir şey bilmez. Bu Health, can puanlarının sahibidir ve iki şeyi duyurur: can değişti ve 0'a ulaştı. Bir çubuk, metin veya oyun bitti ekranı için 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 yalnızca etkinken, OnEnable ve OnDisable ikilisiyle dinler. Olay her iki sayıyı da iletir; bu nedenle Show'un Health'ten başka bir şeye ihtiyacı yoktur. Bir GameOverScreen panelini göstermek için OnDied'e, bir hasar sesi ise OnChanged'e abone olur; her biri kendi betiğinde yer alır ve Health bunların hiçbiri için değişmez. Hp { get; private set; }, HUD'un canı okumasını ama değiştirememesini sağlar.

Bir olay değişiklikleri bildirir; bu nedenle ilk darbeden önce çubuk hiçbir şey duymamıştır. Mevcut canı bir kez, Start'ta çizer. OnEnable'da değil: Unity, nesneleri tek tek ele alarak önce Awake'i, sonra OnEnable'ı çağırır ve bunun için belirlenmiş bir sıra yoktur. Bu nedenle çubuğun OnEnable'ı, Health'in Awake'i Hp'yi ayarlamadan önce çalışabilir ve çubuk 0 gösterebilir. Herhangi bir Start çalıştığında ise tüm Awake'ler çalışmış olur.

challenge icon

Görev

Kolay

Bir atış poligonu. Boşluk tuşu, Gun.cs silahını ateşler. Silahın maxAmmo (6) mermisi vardır ve son mermiyi ateşlemek, şarjörü dolduran reloadTime (1.5) saniyelik bir yeniden doldurma işlemi başlatır. HUD henüz bunların hiçbirini göstermiyor. Silahın değişikliklerini bildirmesini, HUD'un da bunları dinlemesini sağlayın; silaha HUD için bir alan eklemeyin.

  • Gun.cs dosyasına iki genel olay ekleyin: Mermi sayısını ve maxAmmo değerini (iki int) ileten OnAmmoChanged ve bir bool ileten OnReloading: yeniden doldurma başladığında true, bittiğinde false. Yorumların belirttiği yerlerde bu olayları tetikleyin.
  • HUD üzerindeki AmmoHud.cs dosyasında, HUD etkin olduğu sürece her iki olayı da dinleyin. ammoText mermi sayısını Ammo: 4/6 olarak gösterir; reloadText (üzerinde Reloading... yazan nesne) yalnızca yeniden doldurma sırasında görünür.
  • HUD, ilk atıştan önce, en başından itibaren doğru değerleri göstermelidir: Ammo: 6/6 ve yeniden doldurma metni olmamalıdır. Silahın Ammo ve Reloading özellikleri mevcut değerleri verir.
  • HUD yok edilirse silah hatasız ateş etmeye devam eder.

Play'e basın, silahı iki kez boşaltın, ardından Check'e basın.

Kendin dene

using UnityEngine;
using TMPro;

public class AmmoHud : MonoBehaviour
{
    public Gun gun;
    public TMP_Text ammoText;
    public GameObject reloadText;
}
quiz iconKendini test et

Bu ders kısa bir quiz içerir. Soruları yanıtlamak ve ilerlemeni kaydetmek için derse başla.

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