Vianoce v ITnetwork sú tu! Dobí si teraz kredity a získaj až 80 % extra kreditov na e-learningové kurzy ZADARMO. Zisti viac.
Hľadáme nové posily do ITnetwork tímu. Pozri sa na voľné pozície a pridaj sa k najagilnejšej firme na trhu - Viac informácií.

9. diel - Unity (C #) Android: GUI - menu 1

V minulej lekcii, Unity (C #) Android: MenuPart, Eraser, pozadia 2 , sme vylepšili odstraňovanie prekážok, detekciu objektu a pridali levely.

V minulej lekcii, Unity (C #) Android: MenuPart, Eraser, pozadia 2 , sme sa zaoberali opravovaním generovanie mapy. Dnešné tutoriál sa zaoberá vytvorením menu. Je to iba prvá časť. Druhou sa pokúsim urobiť čo najskôr, pretože tam budú kľúčové informácie k sprevádzkovanie tohto prvého spôsobu tvorenia menu.

Video

Skriptovanie menu

Dnes sa nám skripty patrične rozrástli, takže sa ich pokúsim aj trochu okomentovať

Vzhľad 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, ktorý budeme upravovať v budúcom diele sprevádzkovať

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, ktorá nám vráti, či je zariadenie, na ktorom spúšťame 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;
    }

}

Ako hra vyzerá teraz?

Tvorba 2D arkády pre Android v Unity

Problémy?

Ak máte nejaké otázky ohľadom nastavovania, neváhajte sa opýtať v komentároch, alebo mi napísať do správ.

V budúcej lekcii, Unity (C #) Android: GUI - menu 2 , sa budeme naďalej venovať vytváranie menu.


 

Mal si s čímkoľvek problém? Stiahni si vzorovú aplikáciu nižšie a porovnaj ju so svojím projektom, chybu tak ľahko nájdeš.

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 86x (1.74 kB)
Aplikácia je vrátane zdrojových kódov v jazyku C#

 

Predchádzajúci článok
Unity (C #) Android: MenuPart, Eraser, pozadia 2
Všetky články v sekcii
Tvorba 2D arkády pre Android v Unity
Preskočiť článok
(neodporúčame)
Unity (C #) Android: GUI - menu 2
Článok pre vás napísal vratislavino
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
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