Slevový týden - Srpen
30 % bodů zdarma na online výuku díky naší Slevové akci!
Pouze tento týden sleva až 80 % na e-learning týkající se Javy.

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í moc hezký a je rozmazaný. To vyřešíme tak, že si na našem původním obrázku nastavíme Max size na 4096 a potvrdíme. Nastavíme tím, jak kvalitní dotyčný obrázek může být:

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 88x (92.84 kB)

 

Předchozí článek
Unity (C#) Android: Pohyb, grafika, particles
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?
2 hlasů
Aktivity (7)

 

 

Komentáře

Avatar
josef rajmon
Člen
Avatar
josef rajmon:8. května 17:41

ahoj mám problém vše se mi schovavá za pozadím a hraní si s Layouty nepomáhá... neví nekdo co s tím?

 
Odpovědět
8. května 17:41
Avatar
Jan Kubice
Redaktor
Avatar
Odpovídá na josef rajmon
Jan Kubice:8. května 17:45

Pravděpodobně jsou špatně nastavený ordery. Když klikneš na nějaký objekt se spritem najdeš tam nastavení Order In Layer, zkus si pohrát s tím :-)

 
Odpovědět
8. května 17:45
Avatar
josef rajmon
Člen
Avatar
 
Odpovědět
8. května 20:07
Avatar
josef rajmon
Člen
Avatar
Odpovídá na Jan Kubice
josef rajmon:8. května 21:07

pokud jeste mohu otravovat tak co mám delat kdyz v Rigibody2D nemám Fixed Angle?

 
Odpovědět
8. května 21:07
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jan Kubice
Redaktor
Avatar
Odpovídá na josef rajmon
Jan Kubice:8. května 21:21

To budu muset opravit koukám, používán fixed angle ale ve skutečnosti se to jmenuje freeze rotation. Za to se omluvám :-)

 
Odpovědět
8. května 21:21
Avatar
Simon73
Člen
Avatar
Simon73:10. května 0:30

Zdravím, mám problém že posun mapy aj napriek tomu že mám správne script nefunguje
Za skorú radu ďakujem

 
Odpovědět
10. května 0:30
Avatar
Jan Kubice
Redaktor
Avatar
Odpovídá na Simon73
Jan Kubice:10. května 9:47

Koukni se zda máš objekt přiřazený v playerRef a nebo jestli máš script na objektu, to je momentálně jediné co mě napadá. :-)

 
Odpovědět
10. května 9:47
Avatar
Simon73
Člen
Avatar
Odpovídá na Jan Kubice
Simon73:10. května 15:04

mne to stale nefunguje :-S a tym ze ci mam priradeny objekt v playerRef myslis ze ci mam priradeny script na posuvanie tej mapy aj v transforme Playera ?

 
Odpovědět
10. května 15:04
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 8 zpráv z 8.