Zdarzenia sterują UI
Część sekcji Architektura gier w Unity ścieżki Unity w Coddy. Lekcja 15 z 64.
Dzięki zdarzeniom HUD podąża za grą, podczas gdy gra nie wie nic o HUD-zie. Ten komponent Health przechowuje punkty zdrowia i informuje o dwóch rzeczach: zdrowie się zmieniło oraz osiągnęło 0. Nie ma pola na pasek, tekst ani ekran końca gry, więc ten sam komponent działa u gracza, u przeciwnika bez HUD-u oraz w scenie testowej:
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, na 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;
}Pasek nasłuchuje tylko wtedy, gdy jest aktywny, dzięki parze OnEnable i OnDisable. Zdarzenie przekazuje obie liczby, więc Show nie potrzebuje niczego więcej od komponentu Health. GameOverScreen subskrybuje OnDied, aby wyświetlić swój panel, a dźwięk obrażeń subskrybuje OnChanged — każde z nich we własnym skrypcie. Komponent Health nie wymaga żadnych zmian. Hp { get; private set; } pozwala HUD-owi odczytać poziom zdrowia, ale nie go zmieniać.
Zdarzenie informuje o zmianach, więc przed pierwszym trafieniem pasek niczego jeszcze nie usłyszał. Raz rysuje aktualny poziom zdrowia — w metodzie Start. Nie w OnEnable: Unity wywołuje Awake, a potem OnEnable dla poszczególnych obiektów, bez gwarantowanej kolejności, więc OnEnable paska może wykonać się przed Awake komponentu Health, które ustawia Hp, a wtedy pasek pokazałby 0. Zanim wykona się jakakolwiek metoda Start, wszystkie metody Awake już się wykonają.
Wyzwanie
ŁatwySpraw, by broń informowała o swoich zmianach, a HUD nasłuchiwał.
- W
Gun.csdodajusing System;,public event Action<int, int> OnAmmoChangedipublic event Action<bool> OnReloading; wywołuj je w miejscach wskazanych w komentarzach. - W
AmmoHud.cszasubskrybuj zdarzenia wOnEnablei anuluj subskrypcję wOnDisable:ammoTextwyświetlaAmmo: 4/6, areloadTextjest widoczny tylko podczas przeładowywania. - W
Startjednorazowo wyświetlgun.Ammoigun.Reloading.
Naciśnij „Graj” i opróżnij magazynek dwa razy. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
using TMPro;
public class AmmoHud : MonoBehaviour
{
public Gun gun;
public TMP_Text ammoText;
public GameObject reloadText;
}
Wszystkie lekcje w sekcji Architektura gier w Unity
1Komponenty, nie hierarchie
Małe komponentyBazowy skrypt przeciwnikaKomponenty abstrakcyjneWspółpracujące komponentyPowtórka: modułowa wieżyczkaPowtórka: podwójne działo4Dane serializowane
Klasy serializowalneListy w InspectorzeEnumy w InspectorzePodsumowanie: tabela łupówPodsumowanie: losowanie łupów2Interfejsy w Unity
IDamageableInterfejsy i TryGetComponentGetComponentsPowtórka: klawisz interakcjiPowtórka: najbliższy w zasięgu5ScriptableObjects
Zasoby danychStatystyki broniWspółdzielone ustawieniaOcal wiatrFale jako danePowtórka: Baza przedmiotówPowtórka: Kupowanie w sklepie8Kod wielokrotnego użytku
Metody rozszerzająceGeneryczny singletonGeneryczne metody pomocniczePodsumowanie: FindNearest3Zdarzenia
Zdarzenia C# w UnitySubskrybuj w OnEnablePola UnityEventZdarzenia sterują UIPodsumowanie: popup osiągnięciaPodsumowanie: timer popupu6Zapisywanie za pomocą JSON
JsonUtilityZapisz gręWczytywanie i wartości domyślnePodsumowanie: sloty zapisuWybierz i usuń slotPoćwicz samodzielnie: Edytor online Unity