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.
Görev
KolaySilahın değişikliklerini bildirmesini ve HUD'ın bunları dinlemesini sağla.
Gun.csiçindeusing System;,public event Action<int, int> OnAmmoChangedvepublic event Action<bool> OnReloadingekle; bunları yorumlarda belirtilen yerlerde tetikle.AmmoHud.csiçindeOnEnablesırasında abone ol,OnDisablesırasında abonelikten çık:ammoText,Ammo: 4/6değerini gösterir;reloadTextise yalnızca yeniden doldurulurken görünür.Startiçindegun.Ammovegun.Reloadingdeğ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
1Kalıtım Değil, Bileşenler
Küçük BileşenlerTemel Düşman Script'iSoyut BileşenlerBirlikte Çalışan BileşenlerTekrar: Modüler TaretTekrar: Çift Namlulu Top4Serileştirilmiş Veriler
Serileştirilebilir SınıflarInspector'da ListelerInspector'da Enum'larTekrar: Ganimet TablosuTekrar: Ganimeti At2Unity'de Arayüzler
IDamageableArayüzler ve TryGetComponentGetComponentsÖzet: Etkileşim TuşuÖzet: Erişim Mesafesindeki En Yakın5ScriptableObjects
Veri VarlıklarıSilah İstatistikleriOrtak AyarlarRüzgârı KaydetVeri Olarak DalgalarTekrar: Eşya VeritabanıTekrar: Dükkândan Satın Al8Yeniden Kullanılabilir Kod
Genişletme MetotlarıGeneric SingletonGeneric YardımcılarTekrar: FindNearestKendi başına pratik yap: Unity playground