4. diel - Unity (C #) Android: Generovanie Stalag, 2. časť
V minulej lekcii, Unity (C #) Android: Generovanie Stalag , sme si vytvorili okolo mapy pohyblivý tunel, čím sme ju ohraničili, a vygenerovali si 50 Stalag. Mapa má však ešte stále rezervy a preto budeme v generovaní pokračovať aj v dnešnom Unity 3D Android tutoriálu.
Rôzna výška prekážok
Aby všetky prekážky neboli rovnako veľké, upravíme si metódu
GenerateStalag()
v našom StartScript
do nasledujúcej
podoby:
void GenerateStalag(Vector2 p) { GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject; Vector3 scale = g.transform.localScale; scale.y = Random.Range(0.5f, 1.2f); g.transform.localScale = scale; }
Za vysvetlenie stojí riadok:
GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject;
Kód funguje rovnako ako predtým, len s menším rozdielom. Náš vytvorený objekt sa nám uloží do premennej. S touto premennou následne môžeme pracovať a upraviť ľubovoľné vlastnosti nového objektu.
Vytvoríme si plne vyfarbené okraje našej obrazovky, aby sme tam nemali
takú dieru. Výplň si presunieme do objektu Borders1
a
uložíme.
V Prefab nášho Stalag si zmeníme Order in Layer na -1
a
potvrdíme. To zabezpečí, aby sa nám neprekrýval s inými sprity.
Aby naša hra bola lepšie optimalizovaná, Prefab nášho travertínu
vytvoríme vlastný vrstvu. Pomenujeme si ju StalagLayer
a to isté
urobíme s Prefab múry, ktoré vytvoríme vrstvu BorderLayer
:
Ďalej v Edit -> Project settings -> Physics2D nastavíme, aby spolu
StalagLayer
a BorderLayer
v konflikte. To robíme
preto, že na oboch objektoch máme Collider a keby spolu tieto objekty
neustále kolidovali, mohla by sa tým razantne zvýšiť náročnosť našej
hry, ktorá by sa mohla následne kosiť:
Stalag z krajiny
Zatiaľ nám prekážka visí iba zo stropu, zariadime, aby trčala i zo
zeme. To vykonáme ďalšie zmenou skriptu StartScript
:
void Start() { for (int i = 0; i < count; i++) { Vector2 pos = new Vector2(); pos.x = offset + i * distance; int r = Random.Range(0, 2); int rotateIndicator = 1; if (r == 0) { pos.y = 4.5f; // může se lišit podle toho. jak máte vzdálený strop a podlahu od sebe } else { pos.y = -4.5f; // může lišit podle toho, jak máte vzdálený strop a podlahu od sebe rotateIndicator = -1; } GenerateStalag(pos, rotateIndicator); } } void GenerateStalag(Vector2 p, int rotateInd) { GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject; Vector3 scale = g.transform.localScale; scale.y = Random.Range(0.5f, 1.2f) *rotateInd; g.transform.localScale = scale; }
Keď hru spustíme, môžeme vidieť, že sa nám Stalag náhodne otočili.
Optimalizácia
Ďalej si hru trochu optimalizujeme. Teraz generujeme všetky Stalag naraz, lenže to môže byť celkom zbytočné. Teda ich budeme vždy generovať len pár.
Na náš StartingObject
si pridáme Box Collider a Odznačte,
že sa jedná o trigger. Zväčšíme a posunieme ho tak, aby bol na výšku cez
celú našej hraciu plochu a zároveň bol aspoň trochu široký. Následne ho
presunieme pred hráča. Ďalej hráči pridáme tag Player
a
upravíme si náš skript:
public GameObject stalagPrefab; public float distance = 10; public float offset = 10; public int count = 50; public Vector3 lastPos; void Start() { lastPos = transform.position; //GenerateSet(); // již nepotřebujeme ve startu } void GenerateSet() { for (int i = 0; i < count; i++) { Vector2 pos = new Vector2(); pos.x = lastPos.x + (2*distance) + offset + i * distance; int r = Random.Range(0, 2); int rotateIndicator = 1; if (r == 0) { pos.y = 4.5f; // toto číslo se může lišit podle toho, jak máte vzdálený strop a podlahu od sebe } else { pos.y = -4.5f; // toto číslo se může lišit podle toho, jak máte vzdálený strop a podlahu od sebe rotateIndicator = -1; } GenerateStalag(pos, rotateIndicator); } } void GenerateStalag(Vector2 p, int rotateInd) { GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject; Vector3 scale = g.transform.localScale; scale.y = Random.Range(0.5f, 1.2f) *rotateInd; g.transform.localScale = scale; } // vždy, když náš objekt proletí colliderem tohoto objektu, vygenerují se nové překážky a následně se náš celý objekt posune void OnTriggerEnter2D(Collider2D col) { if (col.CompareTag("Player")) { GenerateSet(); lastPos = transform.position; lastPos.x += count * distance; transform.position = lastPos; } }
Ďalej zaistíme, aby sa naše prekážky generovali na správnych miestach. Stačí iba ľahko upraviť našej metódu na generovanie:
void GenerateStalag(Vector2 p, int rotateInd) { GameObject g = Instantiate(stalagPrefab, p, Quaternion.identity) as GameObject; Vector3 scale = g.transform.localScale; scale.y = Random.Range(0.5f, 1.2f) *rotateInd; g.transform.localScale = scale; Bounds bound = g.GetComponent<SpriteRenderer>().bounds; p.y -= bound.size.y / 2 * rotateInd; g.transform.position = p; }
Bounds sú hranice (veľkosť) objektu. Vzali sme si teda veľkosť nášho Spritu na stalagmit a vypočítali sme vďaka tomu ich umiestnenie.
Keď hru spustíme, môžeme vidieť, že už vyzerá pekne.
Náhodná šírka a viac druhov Stalag
Hráča môže omrzieť, keď uvidí iba jednu a tú istú prekážku stále dookola, len inak veľkú. Pridáme teda aj náhodnú šírku Stalag a ďalej i viac druhov.
Viac druhov Stalag
Aby sme generovali viac druhov Stalag, potrebujeme si vytvoriť pole našich prekážok:
public GameObject[] stalagPrefab;
Z našej premenné pre Prefab vytvoríme pole. A následne musíme upraviť ešte časť kódu na generovanie:
GameObject g = Instantiate(stalagPrefab[Random.Range(0, stalagPrefab.Length)], p, Quaternion.identity) as GameObject;
Random.Range(0, stalagPrefab.Length)
nám zaistí vygenerovanie
stalagmitov na náhodnom indexu z celej dĺžky poľa našich stalagmitov.
Teraz, keď sa pozrieme do Inspector na náš StartingObject
,
môžeme tam vidieť možnosť zvoliť veľkosť nášho poľa. My zvolíme
4
.
Môžete použiť sprity, ktoré som vám dal k stiahnutiu a alebo si môžete vytvoriť vlastné.
Následne urobíme to isté ako s prvým Stalag. Nastavíme farbu, Collider, order in layer, Layer a uložíme ako Prefab. Následne tento Prefab dáme do nášho poľa.
Keď hru spustíme, môžeme vidieť, že sa generujú rôzne druhy.
Takto si môžeme vytvoriť ľubovoľný počet rôznych Stalag. Ak nám budú pridať veľké a alebo malé, môžeme si veľkosť generovanie ľubovoľne upraviť.
Pre lepšiu prehľadnosť si vytvoríme ďalšie premenné:
public float minHeight; public float maxHeight; public float minWidth; public float maxWidth;
Vo finále si upravíme našej metódu na generovanie, aby sa náhodne určovala aj šírka Stalag:
scale.y = Random.Range(minHeight, maxHeight) *rotateInd; scale.x = Random.Range(minWidth, maxWidth);
Od teraz môžeme pohodlne z Inspector meniť naše hodnoty a nemusíme pracne hľadať v kóde.
Záver
Pre dnešok to bude všetko. Dúfam, že sa vám séria tutoriálov páči a naučili ste sa niečo nové. Ak máte nejaké pripomienky či nápady, zanechajte komentár, rád sa inšpirujem. Nabudúce sa v lekcii Unity (C #) Android: Nastavenie prostredia pozrieme na vytvorenie menu.
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 424x (92.84 kB)