BLACK FRIDAY! Slevy až 80 % jsou všude. Tak je nepropásni a přejdi do rostoucího IT oboru!
The real BF 2020

Lekce 5 - Unity (C#) Android: GUI - Menu 1

V minulé lekci, Unity (C#) Android: Generování stalagů, 2. část, jsme se podívali na to, jak tvořit překážky.

Dnes se podíváme na herní menu. V tomto Unity tutoriálu se podíváme na dva způsoby jak menu naprogramovat.

Příprava scény pro menu

Vytvoříme si novou scénu a uložíme si ji jako Menu1.

Reaction

Dále si v této scéně vytvoříme gameObject, který si pojmenujeme Reaction. Následně na tento objekt přidáme skript ReactionScript. Tento skript bude obsahovat co se má stát, když se na jednotlivá tlačítka v menu klikne. Ze skriptu si odmažeme metody Start() a Update(). A vytvoříme jednotlivé metody pro různá tlačítka:

private void ClickedArcade()
{
    print("clicked Arcade");
}

private void ClickedSurvival()
{
    print("clicked Survival");
}

private void ClickedExit()
{
    print("clicked Exit");
}

Hra bude mít tedy 2 módy:

  • Arcade a
  • Survival.

Prozatím budeme kliknutím na tlačítka pouze volat výpis do konzole. Objekt Reaction si uložíme do prefabu, abychom ho mohli snadno použít i v další lekci.

Hlavní kamera

Hlavní kameře přidáme nový skript, který si pojmenujeme OnGUIScriptMenu. Opět odmažeme metody Start() i Update().

Na vytváření grafického uživatelského rozhraní budeme využívat Unity metodu OnGUI(). S touto metodou si ukážeme dva různé přístupy jak můžeme vytvořit menu a nebo jakýkoliv jiný GUI prvek. Proto si do skriptu přidáme 2 další metody:

public class OnGUIScriptMenu : MonoBehaviour
{
    public bool useLayout;
    void OnGUI()
    {
        if (useLayout)
            GUIUseLayout();
        else
            GUIDontUseLayout();
    }

    // budeme využívat GUILayout
    void GUIUseLayout()
    {

    }

    // nebudeme využívat  GUILayout
    void GUIDontUseLayout()
    {

    }
}
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!

Jak asi tušíte, metoda GUIUseLayout() se použije v případě, že zvolíme tvorbu menu pomocí GUILayout, viz dále. A metoda GUIDontUseLayout() se spustí v opačném případě. Naučíme se tak oba způsoby a vy si budete moci zvolit, který vám více vyhovuje.

GUILayout

Začneme se způsobem, kde využijeme třídu GUILayout. Kód příslušné metody bude následující:

void GUIUseLayout()
{
    // počáteční area, obaluje celý screen, umožňuje nám pozicovat
    // pomocí GUILayout pozicovacích příkazů
    GUILayout.BeginArea(new Rect(0, 0, Screen.width, Screen.height));

    // vyplní místo maximální možnou mezerou
    GUILayout.FlexibleSpace();

    GUILayout.BeginHorizontal();

    GUILayout.FlexibleSpace();
    GUILayout.BeginVertical();

    // funkce GUILayout.Button() vrací bool, což znamená, že ho můžeme dát
    // rovnou do podmínky
    if (GUILayout.Button("Survival", GUILayout.Width(300), GUILayout.Height(100)))
    {

    }

    if (GUILayout.Button("Arcade", GUILayout.Width(300), GUILayout.Height(100)))
    {

    }

    if (GUILayout.Button("Exit", GUILayout.Width(300), GUILayout.Height(100)))
    {

    }


    GUILayout.EndVertical();

    GUILayout.FlexibleSpace();
    GUILayout.EndHorizontal();

    GUILayout.FlexibleSpace();

    GUILayout.EndArea();
}

Můžete si všimnout, že názvy některých metod začínají na Begin a End. To jsou párové metody. Je to podobné jako například u HTML. Pokud použijeme funkci začínající Begin, musíme jí i někde v kódu ukončit variantou začínající na End.

GUISkin

Samozřejmě nechceme, aby naše menu vypadalo obyčejně. Proto mu přidáme skin.

Skin v kódu

Založíme si ve třídě novou proměnnou uchovávající GUISkin:

public GUISkin menuSkin;

Skin nastavíme přímo v metodě OnGUI():

GUI.skin = menuSkin;
Skin v Assets

Skin jsme nastavili, ale ještě neexistuje. Proto jej musíme v Unity vytvořit. V Assets klikneme klasicky pravým tlačítkem myši -> Create -> GUISkin. Pojmenujeme si ho menuSkin. Jelikož používáme pouze tlačítka, tak si v menuSkin najdeme Button, rozbalíme a dle libosti si můžeme cokoliv upravit. Já upravím pouze Normal a Hover. Tudíž pouze normální stav tlačítka a stav pokud přes něj přejedeme myší. Náš vytvořený skin nesmíme zapomenou vložit do našeho skriptu na kameře. Již hotové sprity na tlačítka najdete v souborech ke stažení. Zájemci si mohou samozřejmě vytvořit své vlastní sprity.

Pokud zapneme hru a budeme přejíždět přes tlačítka, můžeme vidět, jak se mění jejich vzhled.

Reakce na kliknutí

Pokud na tlačítko klikneme, nic se nestane, protože všechny naše metody pro tlačítka máme ve skriptu ReactionScript, tudíž se na něj nějak musíme odkázat.

To můžeme udělat jednoduše tak, že vytvoříme novou proměnnou s tímto skriptem:

public ReactionScript reaction;

Takto se můžeme snadno odkazovat na různé skripty a jejich metody nebo proměnné. My využijeme metody z tohoto skriptu, které se spustí po kliknutí na příslušné tlačítko. Předpřipravený kód tedy doplníme voláním metod v ReactionScript:

if (GUILayout.Button("Survival", GUILayout.Width(300), GUILayout.Height(100)))
{
    reaction.SendMessage("ClickedSurvival");
}

if (GUILayout.Button("Arcade", GUILayout.Width(300), GUILayout.Height(100)))
{
    reaction.SendMessage("ClickedArcade");
}

if (GUILayout.Button("Exit", GUILayout.Width(300), GUILayout.Height(100)))
{
    reaction.SendMessage("ClickedExit");
}

Takto můžeme pozicovat s využitím GUILayout. Výsledek vypadá více než uspokojivě:

Bez GUILayout

Na závěr si ukážeme i jak vytvořit herní menu bez využití GUILayout:

void GUIDontUseLayout()
{
    // funkce pro vytvoření okna s callback funkcí WindowFunc
    GUI.Window(0, CenterRect(320, 350), WindowFunc, "");
}

// metoda, která nám vrátí vycentrovaný Rect o správné velikosti
Rect CenterRect(int width, int height)
{
    Rect r = new Rect();
    r.width = width;
    r.height = height;

    r.x = Screen.width / 2 - width / 2;
    r.y = Screen.height / 2 - height / 2;

    return r;
}

// Callback funkce, která slouží k vykreslení obsahu uvnitř okna
void WindowFunc(int id)
{
    if (GUILayout.Button("Survival", GUILayout.Width(300), GUILayout.Height(100)))
    {
        reaction.SendMessage("ClickedSurvival");
    }

    if (GUILayout.Button("Arcade", GUILayout.Width(300), GUILayout.Height(100)))
    {
        reaction.SendMessage("ClickedArcade");
    }

    if (GUILayout.Button("Exit", GUILayout.Width(300), GUILayout.Height(100)))
    {
        reaction.SendMessage("ClickedExit");
    }
}

V kód voláme metodou Window():

GUI.Window(0, CenterRect(320, 350), WindowFunc, "");

Pojďme si vysvětlit co dělá:

  • Parametr 0 indikuje ID okna. Pokud máte ve scéně více oken, každé musí mít vlastní ID.
  • Jako druhý parametr předáváme Rect, tudíž nějaký obdélník, kterému nastavíme velikost a pozici.
  • Třetím parametrem je funkce, na kterou se bude okno odkazovat. Touto funkcí zajistíme vykreslování potřebných prvků.
  • Posledním parametrem je nadpis okna. Pokud ho necháme prázdný, budeme mít prakticky identicky vypadající menu jako s použitím GUILayout- Pokud tam cokoliv napíšeme, vytvoří se nám nadpis okna.

Jediný rozdíl je, že tento způsob vypadá podstatně méně hezky:

Tvorba GUI menu v Unity

V příští lekci, Unity (C#) Android: Generování stalagů, 2. část, se budeme zabývat tvorbou menu bez programování.


 

Stáhnout

Staženo 59x (1.91 kB)

 

Předchozí článek
Unity (C#) Android: Generování stalagů, 2. část
Všechny články v sekci
Tvorba 2D arkády pro Android v Unity
Článek pro vás napsal Jan Kubice
Avatar
Jak se ti líbí článek?
Ještě nikdo nehodnotil, buď první!
Aktivity (6)

 

 

Komentáře

Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zatím nikdo nevložil komentář - buď první!