3. diel - Unity (C #) Android: Generovanie Stalag
Vítam vás u ďalšieho tutoriálu na 2D hru pre Android v Unity. V minulej lekcii, Unity (C #) Android: Pohyb, grafika, particles , sme naprogramovali pohyb hráča a pridali základné grafiku hry.
V dnešnej lekcii nás čaká vytvorenie mapy. K tomu si môžeme zvoliť dva možné spôsoby. Buďto môžeme tvoriť mapy sami, tým pádom by sme tvorili skôr levely, a alebo môžeme vygenerovať mapu automaticky a mať nekonečnú mapu ako má napríklad hra Flappy bird. My si zvolíme možnosť druhú.
Sprity
Dnes začneme tým, že si na mape urobíme dlhú cestu, zatiaľ ručne. Automaticky generovať budeme až prekážky.
V archíve pod lekcií nájdete niekoľko obrázkov, stiahnite si ich prosím. Obrázky si importuje do Unity. Ak by sme ich presunuli na našej scénu, uvidíme, že máme všetky sprity pohromade, čo samozrejme nechceme. Avšak v hrách sa často súvisiace sprity vkladajú do jedného obrázku, aby sme nemali milión súborov. Naším cieľom je teraz tieto sprity osamostatniť.
Rozdelenie spritov
Pokiaľ si v Assets klikneme na náš obrázok, vpravo môžeme vidieť nastavenia. Sprite mode nastavíme na multiple, čím Unity oznámime, že obrázok obsahuje spritov hneď niekoľko. Následne klikneme na sprite editor. Otvorí sa nám okno, kde môžeme sprity upravovať.
Sprity môžeme rozdeliť niekoľkými spôsobmi.
Prvý spôsob je myšou. Môžeme si myšou zvoliť ľubovoľné oblasti a
tie sa nám následne "rozrežú" na samostatnej sprity. Po kliknutí na Slice
máme ďalšie možnosti. Buďto automaticky, pričom výsledné automatické
upravenie môžeme ľubovoľne meniť, ak chceme. Ďalej môžeme zvoliť Grid.
Sprity, ktoré som vám dodal, majú 100x100 pixelov. Keďže poznáme rozmer,
zvolíme poslednú možnosť, teda Grid. Nastavíme hodnoty X a Y na
100
a klikneme na Slice a Apply. V tento moment máme obrázok
rozrezaný na menšie podobrázky s rozmermi 100x100 pixelov. Teraz môžeme
pracovať s jednotlivými časťami.
Keď si jeden zo spritov pretiahneme do scény a zväčšíme ho, vidíme, že nie je pekný. To vyriešime tak, že si na našom pôvodnom obrázku nastavíme Max size na 4096 a potvrdíme.
Hranice mapy
Teraz si vytvoríme tzv. Prefab, ktorý bude slúžiť ako náš strop a podlaha. Prefab je objekt, ktorý chceme používať viackrát a nechceme ho zakaždým nastavovať (možno ste niekedy počuli o pojme prototyp, princíp je podobný).
Na scénu si pretiahneme teda modrú vodorovnú časť a vynulujeme jej
pozíciu. Scale X nastavíme na 1.05
. Ak by sme to neurobili,
vznikali by nám nepekné medzery medzi sprity. Objekt si premenujeme na
podlaha
. Aby sme náš objekt uložili, stačí ho pretiahnu späť
do Assets. Rovno k tomu využijeme našej zložku Prefab/
. Ak nám
meno objektu zmodrie, znamená to, že je uložený ako Prefab. To isté
urobíme pre strop
.
Teraz, keď na scéne bude ľubovoľný počet týchto spritov a náš objekt upravíme, zmení sa nám všetky. Na náš sprite na scéne pridáme Box Collider 2D (pretože je obdĺžnikový) a ak je to potrebné, upravíme si jeho veľkosť a aplikujeme. Zmeny aplikujeme kliknutím na Overrides a ďalej na Apply all:
Mapa
Sprite máme pripravený. Teraz si môžeme vytvoriť základ pre mapu. Vytvoríme si niečo podobné ako je na obrázku nižšie:
"Tunel" si urobme dostatočne dlhý, aby bol cez celú obrazovku. Objekt
môžeme pohodlne kopírovať cez Ctrl + D a pohodlne
presúvať po jednotkách, ak držíme Ctrl. Ďalej si vytvoríme
prázdny gameObject, vyresetuje jeho pozíciu a pomenujeme ho
Borders1
. Všetky sprity si presunieme pod tento objekt. Z
Borders1
si tiež vytvoríme Prefab.
Posun mapy
Budeme chcieť, aby sa naše ohraničenie posúvalo spoločne s hráčom po
osi X. Tak sa nikdy nestane, že by z mapy vyšiel. Pridáme si teda na
Borders1
skript FollowPlayer
. Jeho kód bude
nasledujúce:
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 }
Prekážka
Teraz, ak hru spustíme, vidíme, že sa pohybuje spoločne s hráčom aj mapa.
Aby sme ale nelietali iba prázdnym tunelom, pridáme aj prekážku. Sprite máte tiež priložený k stiahnutiu. Farbu si dáme zatiaľ napríklad na modrú, aby nám ladil s ohraničením.
Prekážke pridáme tentoraz Edge Collider 2D, pretože už nie je len
obdĺžniková. Ak chceme Collider upraviť, držíme Shift a
upravujeme zelenú čiaru znázorňujúci Collider, kým nám nevznikne niečo
podobné. Objekt si pridáme do Prefab a pomenujeme ho Stalag
:
Generovanie mapy
Poďme si teraz do mapy prekážky vygenerovať. Za to by mal byť
zodpovedný nejaký objekt. Vytvoríme si teda nový GameObject a pomenujeme si
ho StartingObject
, to pretože sa jeho skript bude vykonávať pri
štarte hry. Pridáme na neho nový skript StartScript
s
nasledujúcim obsahom:
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 zadanej pozícii. Tretí parameter slúži pre rotáciu.
Nesmieme zabudnúť priradiť náš stalagmit do Stalag
Prefab.
Po zapnutí by sa nám malo vygenerovať 50 stalagmitov.
Pokračovať budeme zas nabudúce, v lekcii Unity (C #) Android: Generovanie Stalag, 2. časť .
Stiahnuť
Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkamiStiahnuté 479x (92.84 kB)