Lekce 13 - Unity (C#) Android - Healthbar 1
V minulé lekci, Unity (C#) Android: Vylepšení pohybu nakláněním, jsme udělali drobnou opravu sekání a dále vylepšili pohyb postavy hráče.
V dnešním tutoriálu se podíváme na tvorbu health baru, tedy ukazatele zdraví. Určitě nechceme, aby hráč po jednom nárazu zemřel, protože by hra byla frustrující. Dáme hráči možnost párkrát chybovat a ubereme mu jen zdraví.
Text
Přidáme si na scénu nový Text
a pojmenujeme jej
HealthBar
. Dostatečně ho zvětšíme a umístíme nahoru na
střed obrazovky. Jako text mu nastavíme Health: ??
:

HealthScript
Textu přidáme skript HealthScript
. Zdraví chceme mít
celočíselné do 100
. Založíme si tedy proměnnou
health
typu int
a inicializujeme ji v metodě
Start()
:
int health = 100; void Start() { health = 100; }
Dále přidáme metodu Hit(int damage)
, kterou budeme používat
pro ubírání životů:
public void Hit(int damage) { health -= damage; }
Změnu zdraví musíme někam propagovat, zatím se jen mění proměnná a
nic dalšího se neděje. Pro tento účel si vytvoříme další metodu
RefreshScore()
pro aktualizaci textu s hodnotou zdraví. Metodu
budeme volat i v metodě Start()
, aby se nám zdraví
zaktualizovalo i při startu 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 pro odečítání životů je připraven, ale metodu nikde nevoláme.
Otevřeme si proto PlayerCollisionScript
, kde tuto metodu budeme
volat při každé detekci srážky s jiným objektem.
Na začátku si vytvoříme proměnnou pro instanci skriptu
HealthScript
. Při každé srážce budeme volat metodu
Hit()
. Ve výsledku by náš skript měl vypadat takto:
public HealthScript healthScript; void OnCollisionEnter2D(Collision2D col) { if(col.collider.CompareTag("Stalag")) { GameObject stalag = col.collider.gameObject; stalag.SendMessage("React"); } healthScript.Hit(20); }
Nezapomeneme zas v inspektoru přiřadit do proměnné
HeatlhScript
. Tentokrát tam nevložíme přímo skript samotný,
ale objekt, na kterém se nachází, což je HealthBar
, ze kterého
se daný skript vezme:

Když hru nyní spustíme, vidíme, jak nám mizí zdraví při kolizi. Samozřejmě, že zatím umřít nemůžeme, to ale zařídíme již za chvíli.
Obdélník
Budeme pokračovat grafickým obdélníkem, který nám vizuálně bude ukazovat, kolik máme životů, hráč to tak lépe uvidí. Pod text si přetáhneme ideálně nějakou bílou texturu, kterou nastavíme na zelenou. Pokusíme se, aby to vypadalo nějak takto:

Nyní budeme chtít, aby se daný obdélník zmenšil po ose X, když hráč
dostane ránu od nějaké překážky. Vrátíme se opět do
HealthScript
a pro tyto účely si deklarujeme nové
proměnné:
float initSize; public GameObject backGround;
initSize
určuje počáteční velikost obdélníku a
backGround
je proměnná s obdélníkem.
V metodě Start()
si hodnotu initSize
nastavíme.
Hodnota bude obsahovat informace o scale našeho objektu:
initSize = backGround.transform.localScale.x;
Při každém hitu budeme měnit velikost ukazatele. Upravíme si naší
RefreshScore()
metodu, která bude ukazatel procentuálně
zmenšovat podle poškození:
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, pokud hru spustíme a narazíme, vidíme, jak se nám bar
krásně zmenšuje. Jenže stále, když zvládneme dosáhnout 0
zdraví, nic se nestane. Musíme tedy ošetřit situaci, když hráč umře. Pro
tyto účely založíme metodu Die()
a metodu OnGUI()
,
která nám vykreslí tlačítko "Restart" při smrti.
Založíme si tedy další proměnnou:
bool dead = false;
Dále budeme v metodě Hit()
kontrolovat, zda má hráč více
jak 0
zdraví. Pokud ne, zavoláme metodu Die()
a
vytvoříme tlačítko, které restartuje level. Ve výsledku nám vznikne
takový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; }
Když nyní zemřeme, zobrazí se nám tlačítko na restartování hry. Sice stále můžeme hrát dále, ale to vyřešíme v další lekci.
Tímto jsme splnili úkol pro tento díl. Již vizuálně komunikujeme s
hráčem, který ví, kolik má zdraví. Doufám, že se vám tento díl líbil
V příští lekci, Unity (C#) Android - Healthbar 2, se budeme věnovat vylepšení healthbaru.