5. díl - Unity (C#) Android: GUI - menu 1

C# .NET Unity 3D Unity (C#) Android: GUI - menu 1

Tento videotutoriál navazuje na předchozí díl o programování her pro Android v Unity, kde jsme se zabývali opravováním generování mapy. Dnešní dí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ď?

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.


 

Stáhnout

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

 

  Aktivity (1)

Článek pro vás napsal vratislavino
Avatar
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.

Jak se ti líbí článek?
Celkem (2 hlasů) :
55555


 



 

 

Komentáře

Avatar
Tomáš "CrashTest" Bitter:

Nešlo by udělat skript EGameStates, ve kterém by se uchovával enum aktuálního stavu, ve kterém se hra nachází (např. Menu, Game, GameOver ...) ? Vše by bylo statické, takže každý použitý skript ve scéně by akorát kontrolovat současný stav a řídil se podle něj.

Odpovědět 1.1.2015 20:37
Need for Steve
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Tomáš "CrashTest" Bitter
vratislavino:

Udělat by to šlo, ale Unity staví na různých scénách a přijde mi zbytečné to potom dávat do takového enumu, když máme hru takhle rozdělenou pomocí scén. Statické položky se nedoporučují moc používat kvůli paměti. Jinak pokud by to mělo být řešené v jedné scéně (mám pocit, že original Flappy Bird tak dělaný je), vyřešil bych to spíše pomocí nějakého GUIManageru, který by rozhodoval, jaké okno se má zobrazit. Aktuálně v nových výtvorech používám nové Unity UI, tam je to rozdělené na panely. Dnes na to plánuji udělat tutoriál :)

Odpovědět 1.1.2015 21:59
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
Avatar
Odpovídá na vratislavino
Tomáš "CrashTest" Bitter:

Samozřejmě, avšak myslím si, že se to hodí tam, kde se mění GameState v rámci jedné scény. Například v multiplayerové tahové hře, když se mění hráč na tahu (pokud je to sotisfikovaná hra, kde mohou hráči reagovat na tah jiného hráče, třeba "BANG!", i když to není PC hra), tak tam nelze jen tak přecházet mezi scénami.

Odpovědět 1.1.2015 22:21
Need for Steve
Avatar
vratislavino
Redaktor
Avatar
Odpovídá na Tomáš "CrashTest" Bitter
vratislavino:

Ano ano, pochopil jsem proč, proto jsem uvedl například toho Flappyho :) ale asi bych i tak udělal spíše jeden objekt GameManager, který by rozhodoval, jaký stav má zrovna nastat, ideálně pomocí událostí :)

Odpovědět 1.1.2015 22:53
Hlavou teď neprorazíš, ale stojí za to to zkoušet :)
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.

Zobrazeno 4 zpráv z 4.