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í.

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

Tvorba 2D arkády pro Android v Unity

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:

Tvorba 2D arkády pro Android v Unity

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:

Tvorba 2D arkády pro Android v Unity

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.


 

Předchozí článek
Unity (C#) Android: Vylepšení pohybu nakláněním
Všechny články v sekci
Tvorba 2D arkády pro Android v Unity
Přeskočit článek
(nedoporučujeme)
Unity (C#) Android - Healthbar 2
Článek pro vás napsal Jan Kubice
Avatar
Uživatelské hodnocení:
2 hlasů
Aktivity