Jarní BF Python týden
100% homeoffice, 100% časově flexibilní fulltime programátor pro ITnetwork.cz. #bezdeadlinu Mám zájem!
Využij Jarní akci a získej od nás 50 % bodů navíc zdarma! Zároveň také probíhá Python týden se slevou na e-learning až 80 %

Lekce 3 - Unity (C#) Android: Generování stalagů

Vítám vás u dalšího tutoriálu na 2D hru pro Android v Unity. V minulé lekci, Unity (C#) Android: Pohyb, grafika, particles, jsme naprogramovali pohyb hráče a přidali základní grafiku hry.

V dnešní lekci nás čeká vytvoření mapy. K tomu si můžeme zvolit dva možné způsoby. Buďto můžeme tvořit mapy sami, tím pádem bychom tvořili spíše levely, a nebo můžeme vygenerovat mapu automaticky a mít nekonečnou mapu jako má například hra Flappy bird. My si zvolíme možnost druhou.

Sprity

Dnes začneme tím, že si na mapě uděláme dlouhou cestu, zatím ručně. Automaticky generovat budeme až překážky.

V archivu pod lekcí naleznete několik obrázků, stáhněte si je prosím. Obrázky si naimportujeme do Unity. Pokud bychom je přetáhli na naší scénu, uvidíme, že máme všechny sprity pohromadě, což samozřejmě nechceme. Nicméně ve hrách se často související sprity vkládají do jednoho obrázku, abychom neměli milion souborů. Naším cílem je nyní tyto sprity osamostatnit.

Rozdělení spritů

Pokud si v Assets klikneme na náš obrázek, vpravo můžeme vidět nastavení. Sprite mode nastavíme na multiple, čímž Unity sdělíme, že obrázek obsahuje spritů hned několik. Následně klikneme na sprite editor. Otevře se nám okno, kde můžeme sprity upravovat.

Sprity můžeme rozdělit několika způsoby.

První způsob je myší. Můžeme si myší zvolit libovolné oblasti a ty se nám následně "rozřežou" na samostatné sprity. Po kliknutí na Slice máme další možnosti. Buďto automaticky, přičemž výsledné automatické upravení můžeme libovolně měnit, pokud chceme. Dále můžeme zvolit Grid. Sprity, které jsem vám dodal, mají 100x100 pixelů. Jelikož známe rozměr, zvolíme poslední možnost, tedy Grid. Nastavíme hodnoty X a Y na 100 a klikneme na Slice a Apply. V tento moment máme obrázek rozřezaný na menší podobrázky s rozměry 100x100 pixelů. Nyní můžeme pracovat s jednotlivými částmi.

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

Když si jeden ze spritů přetáhneme do scény a zvětšíme ho, vidíme, že není hezký. To vyřešíme tak, že si na našem původním obrázku nastavíme Max size na 4096 a potvrdíme.

Hranice mapy

Nyní si vytvoříme tzv. Prefab, který bude sloužit jako náš strop a podlaha. Prefab je objekt, který chceme používat vícekrát a nechceme ho pokaždé nastavovat (možná jste někdy slyšeli o pojmu prototyp, princip je podobný).

Na scénu si přetáhneme tedy modrou vodorovnou část a vynulujeme její pozici. Scale X nastavíme na 1.05. Pokud bychom to neudělali, vznikaly by nám nehezké mezery mezi sprity. Objekt si přejmenujeme na podlaha. Abychom náš objekt uložili, stačí ho přetáhnou zpět do Assets. Rovnou k tomu využijeme naší složku Prefab/. Pokud nám jméno objektu zmodrá, znamená to, že je uložený jako Prefab. To samé uděláme pro strop.

Teď, když na scéně bude libovolný počet těchto spritů a náš objekt upravíme, změní se nám všechny. Na náš sprite na scéně přidáme Box Collider 2D (protože je obdélníkový) a pokud je to potřeba, upravíme si jeho velikost a aplikujeme. Změny aplikujeme kliknutím na Overrides a dále na Apply all:

Mapa

Sprite máme připravený. Nyní si můžeme vytvořit základ pro mapu. Vytvoříme si něco podobného jako je na obrázku níže:

"Tunel" si udělejme dostatečně dlouhý, aby byl přes celou obrazovku. Objekt můžeme pohodlně kopírovat přes Ctrl + D a pohodlně přesouvat po jednotkách, pokud držíme Ctrl. Dále si vytvoříme prázdný gameObject, vyresetujeme jeho pozici a pojmenujeme jej Borders1. Všechny sprity si přesuneme pod tento objekt. Z Borders1 si také vytvoříme Prefab.

Posun mapy

Budeme chtít, aby se naše ohraničení posouvalo společně s hráčem po ose X. Tak se nikdy nestane, že by z mapy vyjel. Přidáme si tedy na Borders1 skript FollowPlayer. Jeho kód bude následující:

public Transform playerRef; // veřejný odkaz na našeho hráče, přesněji jeho Transform
Vector2 pos;

bool error = false;

void Start()
{
    if (playerRef == null)
        error = true;       // pokud zapomeneme přiřadit, nastavíme error na true
}

void Update()
{
    if (error)
        return; // nebude se provádět Update()

    // transform.position = new Vector2(playerRef.position.x, playerRef.position.y);  Dělá to samé, co kód níže, doporučuji používat spíše druhou možnost

       pos = transform.position; // pozice objektu, na kterém je skript

       pos.x = playerRef.position.x; // pozici na ose X nastavíme stejnou jako má hráč

       transform.position = pos; // nastavení pozice objektu, na kterém je skript na pozici pos
}

Překážka

Nyní, pokud hru spustíme, vidíme, že se pohybuje společně s hráčem i mapa.

Aby jsme ale nelétali pouze prázdným tunelem, přidáme i překážku. Sprite máte rovněž přiložený ke stažení. Barvu si dáme zatím například na modrou, aby nám ladil s ohraničením.

Překážce přidáme tentokrát Edge Collider 2D, protože již není jen obdélníková. Pokud chceme Collider upravit, držíme Shift a upravujeme zelenou čáru znázorňující collider, dokud nám nevznikne něco podobného. Objekt si přidáme do Prefabu a pojmenujeme jej Stalag:

Generování mapy

Pojďme si nyní do mapy překážky vygenerovat. Za to by měl být zodpovědný nějaký objekt. Vytvoříme si tedy nový GameObject a pojmenujeme si ho StartingObject, to protože se jeho skript bude provádět při startu hry. Přidáme na něj nový skript StartScript s následujícím obsahem:

public GameObject stalagPrefab;
public float distance = 10; // vzdálenost mezi jednotlivými stalagy
public float offset = 1;
public int count = 50;

void Start()
{
    for (int i = 0; i < count; i++)
    {
        Vector2 pos = new Vector2();
        pos.x = offset + i * distance;
        GenerateStalag(pos);
    }
}

void GenerateStalag(Vector2 p)
{
    Instantiate(stalagPrefab, p, Quaternion.identity);
}

Instantiate(stalagPrefab, p, Quaternion.identity) nám generuje nové objekty na zadané pozici. Třetí parametr slouží pro rotaci.

Nesmíme zapomenout přiřadit náš stalagmit do Stalag Prefab.

Po zapnutí by se nám mělo vygenerovat 50 stalagmitů.

Pokračovat budeme zas příště, v lekci Unity (C#) Android: Generování stalagů, 2. část.


 

Stáhnout

Staženo 30x (92.84 kB)

 

 

Aktivity (3)

 

 

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