04. Interakcia a prekážky
V tejto lekcii pridáme interakciu – vystrelenie loptičky a vygenerujeme prekážky na stole.
Kým sa naučíme písať svoje vlastné skripty, pomôžeme si hotovým skriptom na odpálenie loptičky:
Stiahnite si do assetov skript Player.cs a priraďte ho na game objekt Main Camera
Tento skript funguje tak, že pri stlačení medzery odpáli loptičku smerom od kamery. Aby sme to mohli otestovať, tak odstráňme šikmú rampu, ktorú sme si na stôl pridali minule:

Keď teraz spustíte hru, loptička spadne na stôl a keď sa ku nej priblížime, tak by sa mala po stlačení medzery odpáliť. Funguje vám to? No nefunguje. A teraz prečo?
Zoznámenie sa s konzolou
Keď niečo nefunguje, ako by sme chceli, často je to kvôli nejakej chybe. Niektoré programy sa pri chybe celé zosypú, spadnú, zamrznú. Unity je v tomto prívetivejšie a obvykle problematický krok radšej nevykoná a informuje nás o tom červenou chybovou hláškou na spodku okna:

Keď sa teraz prepneme do záložky Console (Vedľa záložky Project) tak uvidíme všetky chybové hlášky a upozornenia, ktoré nám Unity hlási:

Chýb, ktoré môžu nastať, je veľa. Jednou z najčastejších ale je, že sme niečo niekde zabudli nastaviť. Ako aj v tomto prípade. Unity nás upozorňuje, že:
Premenná „ball“ v skripte Player nebola nastavená. Nastavte premennú „ball“ skriptu Player v inšpektore.
A to sa presne aj stalo. Na kameru sme priradili skript Player, ktorý má odstreľovať loptičku, ale nepovedali sme mu, čo v scéne vlastne loptička je. Zastavme hru a poďme to opraviť.
Priradenie objektu do skriptu
Označme si game objekt Main Camera a pozrime sa bližšie do jeho inšpektora. Je tam skript Player:

Tento skript robí to, že po stlačení medzery odpáli loptičku. Lenže tento skript sám o sebe nevie, čo v scéne je loptička. Pre neho sú všetko len game objekty, jeden ako druhý. Preto v inšpektore obsahuje vlastnosť Ball, do ktorej mu nastavíme, čo sa má odpaľovať.
Pretiahnite z hierarchie game objekt Lopticka do vlastnosti Ball v inšpektore.

Keď teraz spustíme hru, loptička sa už odpaľuje. Základná interakcie je tu, poďme hru spestriť prekážkami.
Moja prvá prekážka
V hre budeme mať rôzne prekážky, začnime s jednoduchou postavičkou, ktorej úlohou bude zavadzať v ceste loptičke:
- Vytvorte nový game objekt typu 3D > Capsule a nazvite ho Prekazka
- Vytvorte v assetoch nový materiál s názvom PrekazkaMat
- Stiahnite si textúru enemy.png a priraďte ju do materiálu
- Priraďte materiál PrekazkaMat na game objekt Prekazka

Keby sme chceli takýchto prekážok vyrobiť viac, mohli by sme tento postup zopakovať znova. Alebo by sme mohli game objekt Prekazka zduplikovať (CTRL-D). Môžeme si ich takto navyrábať aj 100. Ale čo budeme robiť, keď budeme chcieť napríklad zmeniť farbu prekážke alebo pridať na prekážku nejaký komponent? Budeme to musieť 100x zopakovať pre každý kus?
Na vytváranie rovnakých game objektov z jednej šablóny má Unity mechanizmus, ktorý sa volá Prefab (ako prefabrikát – predpripravený výrobok). A my teraz jeden takýto prefab vyrobíme z našej prekážky.
Môj prvý prefab
Prefaby sa vytvárajú tak, že z hierarchie stiahneme game objekt medzi Assety:
- Vytvorte v Assets adresár Prefabs
- Pretiahnite game objekt Prekazka do Prefabs
Medzi assetmi nám takto pribudol nový prefab Prekazka. Tiež sa stalo, že game objekt Prekazka v hierarchii zmodral:

Prefab je akási kombinácia game objektu a assetu. Game objekt je to v tom, že má vlastnú geometriu a obsahuje komponenty, nie je to len samostatná textúra či skript. Asset je v tom, že sedí medzi assetmi a čaká, kým ho vytiahneme na scénu. Vyskúšajme to.
- Zmažte z hierarchie game objekt Prekazka.
- Pretiahnite z assetov do scény prefab Prekazka. Takto si naťahajte do scény viacero prekážok

Všetky takto vytvorené prekážky sú kópiou nášho prefabu Prekazka. Preto aj majú v hierarchii názov zvýraznený modrou farbou: Každý game objekt vytvorený z assetu je v hierarchii zvýraznený modrou.
Výhody prefabov
Game objekty vytvorené z prefabov sú klonmi pôvodného prefabu a keď urobíme nejakú zmenu na originálnom prefabe, zmena sa prenesie aj na jeho klony. Vyskúšajme.
- Označte si v assetoch prefab Prekazka
- V inšpektore sa zobrazia jeho komponenty a vlastnosti, zmeňte Scale v komponente Transform na hodnoty X:2, Y:2, Z:2

Všetky klony automaticky zmenili svoju veľkosť podľa svojho originálu. Funguje to aj naopak? Vyskúšajte:
- Označte si jednu z prekážok v scéne.
- Zmeňte jej Scale na X:3, Y:3, Z:3

Jedna z prekážok narástla na obra. Ale zmena urobená na tomto game objekte sa nepreniesla naspäť na prefab ani na ostatné game objekty vyrobené z toho istého prefabu.
A čo sa stane s naším obrom, keď v prefabe nastavíme veľkosť naspäť na 1? Vyskúšajme aj to:
- Označte si v assetoch prefab Prekazka
- Zmeňte Scale v jeho komponente Transform na hodnoty X:1, Y:1, Z:1

Zmena veľkosti urobená na prefabe sa preniesla len na tie game objekty, ktorých veľkosť sme nemenili priamo. Tieto game objekty sa zmenšili naspäť z 2 na 1. Ale obor zostal obrom. Máme teda v rukách nástroj ako robiť univerzálne zmeny z pozície prefabu, ale zároveň zachovať špecifické zmeny urobené na konkrétnych jednotlivých game objektoch.
Ak sa pozrieme na inšpektor tohto nášho obra, uvidíme tam, že niektoré hodnoty sú vyznačené hrubým písmom:

Hrubým písmom sú zvýraznené tie hodnoty, ktoré má game objekt špecificky odlišné od prefabu a nepreberá ich od neho. Tu napríklad je to Position, Rotation, Scale. Ale napríklad hodnotu materiálu (PrekazkaMat) v komponente Mesh Renderer zvýraznenú nemá, lebo tú preberá z prefabu. Teda kým mu ju nejak špecificky nezmeníme.
- Stiahnite si textúru enemy2.png a vyrobte s jej použitím nový materiál PrekazkaMat2
- Aplikujte tento materiál na nášho obra.
Môžete vidieť, že v jeho inšpektore už vlastnosť s materiálom PrekazkaMat2 je zvýraznená hrubým písmom:

A samozrejme jeho farba sa zmenila podľa nového materiálu:

Čo by sme robili, keby sme chceli, aby sa niektorá takto špecificky zmodifikovaná vlastnosť zmenila naspäť na hodnotu, ktorú game objekt preberá od prefabu? Stačí pravý klik na túto vlastnosť v inšpektore príslušného game objektu (nie prefabu!) a vybrať možnosti Revert. Tá vráti vlastnosť do stavu, že sa jej hodnota znova preberá od assetu:

Keď toto aplikujeme na vlastnosť Scale u nášho obra, jeho veľkosť sa vráti na veľkosť podľa prefabu:

Naopak, vieme aj nejakú vlastnosť špecificky nastavenú v game objekte nasilu previesť do prefabu? Taká akási obrátená dedičnost? Rovnako pravý klik na vlastnosť a vyberieme možnosť Apply to Prefab ‚…‘:

Keď to použijeme na našu žltú prekážku a takto dáme aplikovať vlastnosť s materiálom (Mesh Renderer > Materials > Element 0), tak tento žltý materiál prenesie na prefab a následne aj na všetky ostatnú game objekty, ktoré túto vlastnosť z prefabu preberajú:

Týmto sme si odskúšali základnú prácu s prefabmi, teraz by ste už mali vedieť, ako sa taký prefab vyrába a ako sa z prefabu vyrábajú game objekty. Tiež sme si ukázali, aké vzťahy platia medzi prefabom a game objektami, ktoré z neho vyklonujeme.
V ďalšom dieli budeme pokračovať tým, že vytvoríme automatický generátor prekážok a pridáme prekážkam nejakú jednoduchú logiku.
Hotový projekt po skončení tejto lekcie: MojaHra_04.zip
