12. diel - Unity (C #) Android - Healthbar 1
V minulej lekcii, Unity (C #) Android: Vylepšenia pohybu nakláňaním , sme urobili drobnú opravu sekanie a ďalej vylepšili pohyb postavy hráčov.
V dnešnom tutoriálu sa pozrieme na tvorbu health baru, teda ukazovatele zdravie. Určite nechceme, aby hráč po jednom náraze zomrel, pretože by hra bola frustrujúca. Dáme hráči možnosť párkrát chybovať a uberieme mu len zdravie.
Text
Pridáme si na scénu nový Text
a pomenujeme ho
HealthBar
. Dostatočne ho zväčšíme a umiestnime hore na stred
obrazovky. Ako text mu nastavíme Health: ??
:
HealthScript
Textu pridáme skript HealthScript
. Zdravie chceme mať
celočíselné do 100
. Založíme si teda premennú
health
typu int
a inicializujeme ju v metóde
Start()
:
int health = 100; void Start() { health = 100; }
Ďalej pridáme metódu Hit(int damage)
, ktorú budeme
používať pre uberanie životov:
public void Hit(int damage) { health -= damage; }
Zmenu zdravie musíme niekam propagovať, zatiaľ sa len mení premenná a
nič ďalšie sa nedeje. Pre tento účel si vytvoríme ďalšiu metódu
RefreshScore()
pre aktualizáciu textu s hodnotou zdravie. Metódu
budeme volať aj v metóde Start()
, aby sa nám zdravie
zaktualizovalo aj pri štarte hry:
void Start () { health = 100; RefreshScore(); } public void Hit(int damage) { health -= damage; RefreshScore(); } void RefreshScore() { gameObject.GetComponent<Text>().text = "Health: " + health; }
PlayerCollisionScript
Základ pre odčítanie životov je pripravený, ale metódu nikde nevoláme.
Otvoríme si preto PlayerCollisionScript
, kde túto metódu budeme
volať pri každej detekcii zrážky s iným objektom.
Na začiatku si vytvoríme premennú pre inštanciu skriptu
HealthScript
. Pri každej zrážke budeme volať metódu
Hit()
. Vo výsledku by náš skript mal vyzerať takto:
public HealthScript healthScript; void OnCollisionEnter2D(Collision2D col) { if(col.collider.CompareTag("Stalag")) { GameObject stalag = col.collider.gameObject; stalag.SendMessage("React"); } healthScript.Hit(20); }
Nezabudneme zas v inšpektorovi priradiť do premennej
HeatlhScript
. Tentoraz tam nevložíte priamo skript samotný, ale
objekt, na ktorom sa nachádza, čo je HealthBar
, z ktorého sa
daný skript vezme:
Keď hru teraz spustíme, vidíme, ako nám mizne zdravia pri kolízii. Samozrejme, že zatiaľ umrieť nemôžeme, to ale zariadime už za chvíľu.
Obdĺžnik
Budeme pokračovať grafickým obdĺžnikom, ktorý nám vizuálne bude ukazovať, koľko máme životov, hráč to tak lepšie uvidí. Pod text si pretiahneme ideálne nejakú bielu textúru, ktorú nastavíme na zelenú. Pokúsime sa, aby to vyzeralo nejako takto:
Teraz budeme chcieť, aby sa daný obdĺžnik zmenšil po osi X, keď hráč
dostane ranu od nejakej prekážky. Vrátime sa opäť do
HealthScript
a pre tieto účely si deklarujeme nové
premenné:
float initSize; public GameObject backGround;
initSize
určuje počiatočnú veľkosť obdĺžnika a
backGround
je premenná s obdĺžnikom.
V metóde Start()
si hodnotu initSize
nastavíme.
Hodnota bude obsahovať informácie o scale nášho objektu:
initSize = backGround.transform.localScale.x;
Pri každom hitu budeme meniť veľkosť ukazovatele. Upravíme si našej
RefreshScore()
metódu, ktorá bude ukazovateľ percentuálne
zmenšovať podľa odtrhnutého poškodenie:
void RefreshScore() { gameObject.GetComponent<Text>().text = "Health: " + health; Vector3 scale = backGround.transform.localScale; scale.x = initSize / 100 * health; backGround.transform.localScale = scale; }
V tento moment, ak hru spustíme a narazíme, vidíme, ako sa nám bar
krásne zmenšuje. Lenže stále, keď zvládneme dosiahnuť 0
zdravie, nič sa nestane. Musíme teda ošetriť situáciu, keď hráč umrie.
Pre tieto účely založíme metódu Die()
a metódu
OnGUI()
, ktorá nám vykreslí tlačidlo "Restart" pri smrti.
Založíme si teda ďalšie premennú:
bool dead = false;
Ďalej budeme v metóde Hit()
kontrolovať, či má hráč viac
ako 0
zdravia. Ak nie, zavoláme metódu Die()
a
vytvoríme tlačidlo, ktoré reštartuje level. Vo výsledku nám vznikne
takýto skript:
int health = 100; float initSize; bool dead = false; // Use this for initialization void Start() { initSize = transform.localScale.x; health = 100; RefreshScore(); } public void Hit(int damage) { if (dead) return; health -= damage; RefreshScore(); if (health <= 0) Die(); } void Die() { dead = true; } void OnGUI() { if(dead) { if(GUILayout.Button("Restart")) { Application.LoadLevel(Application.loadedLevel); } } } void RefreshScore() { gameObject.GetComponent<Text>().text = "Health: " + health; Vector3 scale = transform.localScale; scale.x = initSize / 100 * health; transform.localScale = scale; }
Keď teraz zomrieme, zobrazí sa nám tlačidlo na reštartovanie hry. Síce stále môžeme hrať ďalej, ale to vyriešime v ďalšej lekcii.
Týmto sme splnili úlohu pre tento diel. Už vizuálne komunikujeme s hráčom, ktorý vie, koľko má zdravie. Dúfam, že sa vám tento diel páčil:)
V budúcej lekcii, Unity (C #) Android - Healthbar 2 , sa budeme venovať vylepšenia healthbaru.