IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

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: ??:

Tvorba 2D arkády pre Android v Unity

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:

Tvorba 2D arkády pre Android v Unity

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:

Tvorba 2D arkády pre Android v Unity

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.


 

Predchádzajúci článok
Unity (C #) Android: Vylepšenia pohybu nakláňaním
Všetky články v sekcii
Tvorba 2D arkády pre Android v Unity
Preskočiť článok
(neodporúčame)
Unity (C #) Android - Healthbar 2
Článok pre vás napísal Jan Kubice
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Aktivity