Pouze tento týden sleva až 80 % na e-learning týkající se Javy
Nauč se s námi víc. Využij 50% zdarma na e-learningové kurzy.

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:

Stáhněte si prosím několik následujících obrázků:

Obrázky si naimportujeme do Unity.

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ý).

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

Na scénu si přetáhneme 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 floor. 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, přičemž objekt si pojmenujeme ceiling.

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 Borders. Všechny sprity si přesuneme pod tento objekt. Z Borders 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 Borders 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;

void 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žením následujícího souboru souhlasíš s licenčními podmínkami

Staženo 198x (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

 

 

Komentáře

Avatar
Josef Rajmon
Brigádník
Avatar
Josef Rajmon:8.5.2020 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.5.2020 17:41
Existuje lepší moznost, najdi ji!
Avatar
Jan Kubice
Člen IT Redactor Gang
Avatar
Odpovídá na Josef Rajmon
Jan Kubice:8.5.2020 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.5.2020 17:45
Avatar
Josef Rajmon
Brigádník
Avatar
Odpovědět
8.5.2020 20:07
Existuje lepší moznost, najdi ji!
Avatar
Josef Rajmon
Brigádník
Avatar
Odpovídá na Jan Kubice
Josef Rajmon:8.5.2020 21:07

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

Odpovědět
8.5.2020 21:07
Existuje lepší moznost, najdi ji!
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jan Kubice
Člen IT Redactor Gang
Avatar
Odpovídá na Josef Rajmon
Jan Kubice:8.5.2020 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.5.2020 21:21
Avatar
Simon73
Člen
Avatar
Simon73:10.5.2020 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.5.2020 0:30
Avatar
Jan Kubice
Člen IT Redactor Gang
Avatar
Odpovídá na Simon73
Jan Kubice:10.5.2020 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.5.2020 9:47
Avatar
Simon73
Člen
Avatar
Odpovídá na Jan Kubice
Simon73:10.5.2020 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.5.2020 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.