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 5 - Unity (C#) Android: GUI - menu 1

V minulé lekci, Unity (C#) Android: Generování stalagů 2, jsme se zabývali opravováním generování mapy. Dnešní tutoriál se zabývá vytvořením menu. Je to pouze první část. Druhou se pokusím udělat co nejdříve, protože tam budou klíčové informace k zprovoznění tohoto prvního způsobu tvoření menu.

Video

Skriptování menu

Dnes se nám skripty patřičně rozrostly, takže se je pokusím i trochu okomentovat

Vzhled a interface menu

using UnityEngine;
using System.Collections;


[ExecuteInEditMode] //tento řádek nám umožní vidět změny v GUI, aniž bychom museli hru spouštět
public class OnGUIScriptMenu : MonoBehaviour {

    public bool useLayout;
    public GUISkin menuSkin;
    public GameObject reaction;

    // funkce sloužící k vykreslování GUI (neboli HUD), pozor na to, jak se metoda píše
    // a myslete na to, že se volá asi 7x častěji než Update, takže tady
    // nejsou nejvýhodnější složité opakované propočty
    void OnGUI()
    {
        GUI.skin = menuSkin; // přiřazení skinu, tímto
                             // řádkem nastavujeme předem definovaný vzhled

        if (useLayout)
            GUIUseLayout();
        else
            GUIDontUseLayout();
    }

    // funkce použitá pro vkládání prvků do layoutu
    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)))
        {
        // SendMessage na daném objektu zavolá ve všech skriptech metodu
            // ClickedSurvival(), pokud ji mají
            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");
        }


        GUILayout.EndVertical();

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

        GUILayout.FlexibleSpace();

        GUILayout.EndArea();
    }

    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");
        }
    }
}

Jednoduchý reakční skript, který budeme upravovat v příštím díle zprovozňovat

using UnityEngine;
using System.Collections;

public class ReactionScript : MonoBehaviour {

    // metody mohou být private, protože je voláme metodou SendMessage("názevmetody"),
    // která se volá ve skriptech lokálně

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

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

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

}

Jednoduchá utilitka, která nám vrátí, jestli je zařízení, na kterém spouštíme hru, mobil

using UnityEngine;
using System.Collections;

public class Utils : MonoBehaviour {

    public static bool IsMobile()
    {
        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.WP8Player || Application.platform == RuntimePlatform.IPhonePlayer)
            return true;
        else
            return false;
    }

}

Jak hra vypadá teď?

Zdrojákoviště Unity - 2D hry

Problémy?

Pokud máte nějaké otázky ohledně nastavování, neváhejte se zeptat v komentářích, nebo mi napsat do zpráv.

V příští lekci, Unity (C#) Android: GUI - menu 2, se budeme nadále věnovat vytváření menu.

V příští lekci, Unity (C#) Android: GUI - menu 2, se podíváme na ještě pohodlnější způsob, jak tvořit naše GUI :).


 

Měl jsi s čímkoli problém? Stáhni si vzorovou aplikaci níže a porovnej ji se svým projektem, chybu tak snadno najdeš.

Stáhnout

Stažením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 86x (1.74 kB)
Aplikace je včetně zdrojových kódů v jazyce C#

 

Předchozí článek
Unity (C#) Android: Generování stalagů 2
Všechny články v sekci
Zdrojákoviště Unity - 2D hry
Přeskočit článek
(nedoporučujeme)
Unity (C#) Android: GUI - menu 2
Článek pro vás napsal vratislavino
Avatar
Uživatelské hodnocení:
4 hlasů
Autor se věnuje programování v C#, především pak ve vývojovém prostředí Unity3D. Má asi pětileté zkušenosti s programováním a momentálně pracuje na připravované hře Azulgar: Beyond The Frontiers.
Aktivity