04 - Hierarchie, manipulácie
Last updated
Last updated
Tradične nie je v Unity zvykom modelovať nič zložitejšie a nebudeme to robiť ani my. Ale na nasledujúcom príklade si ukážeme koncept hierarchie objektov v scéne a precvičíme manipulácie s objektami v scéne:
Vytvorte v scéne novú kocku (GameObject->3D Object->Cube). Pomocou inšpektora jej nastavte polohu na [0, 0, 0]
:
Polohu jej nastavujeme preto, že defaultne bude jej poloha závisieť od toho, kam sa v scéne pozeráme a to sú vždy nepredvídateľné čísla.
Nastavte kocke škálu na [5, 0.5, 3]
, toto bude základňa. Premenujte aj game objekt na napríklad Spodok.
Z kocky teraz vyrobte duplikát, jedným z dvoch spôsobov:
Pravý klik na Spodok v hierarchii a Duplicate
Ctrl-D
Premenujte nový game objekt na Bok a nastavte mu veľkosť na [0.5, 8.5, 3]
:
Bočná stena, ktorú sme práve vytvorili patrí na bok a chceme ju tam presunúť. Aby sme nenarazili na nepresnosť pohybu myšou, je výhodne využiť nejakú formu prichytávania.
Tajný trik v Unity je prichytávanie vrcholu jedného objektu na vrchol iného objektu. Označte si ako aktívny game objekt Bok a vyberte si nástroj Move:
Keď teraz držíte stlačený kláves V (v ako vrchol, v ako vertex) tak je vám scéne umožní selektovať konkrétne vrcholy na objekte. Aj kurzor sa zmení na biely štvorček
Držte stále stlačené V a pretiahnite jeden roh boku na roh spodku:
Model sa premiestni tak, aby sa vrchol, ktorý ste začali ťahať presunul na vrchol, kam ste ho ťahali:
Zduplikujte Bok a premenujte jeden bok na Bok Lavy a druhý a Bok Pravy.
Posuňte Bok Pravy na druhú stranu spodku, znova vrchol na vrchol:
Zduplikujte Spodok, premenujte ho na Vrch a presuňte ho na vrch:
Vytvorte novú kocku a pomenujte ju Chrbat. Kocka sa opäť vytvorila na prakticky náhodné súradnice:
Ale teraz tieto čísla nemeňme. Ukážeme si iný prístup.
Nastavte rozmery Chrbatu na [5, 8, 0.5]
. Objekt bude umiestnený niekde mimo, lebo sme mu nemenili pozíciu v inšpektore:
Prichytávať vieme okrem vrcholov aj do mriežky. To znamená, že celý 3D svet je rozdelený na neviditeľnú mriežku (resp. v Unity je aj trochu viditeľná) a keď hýbeme objektami, tak sa objekty prichytávajú k vrcholom v tejto mriežke. Vo výsledku tak budú mať pekné okrúhle súradnice.
Hore v paneli Scene nájdeme prepínač na prichytávanie, ikonka s magnetom:
Rozkliknite šípku pri tlačidle a nastavte interval prichytávania na 0.5:
Ak ste ešte nezapli prichytávanie, tak sa uistite, že je zapnuté (klik na ikonku s magnetom):
Keď teraz budete posúvať Chrbat pomocou Move nástroja, tak sa bude prichytávať na súradnice po krokoch 0.5, a vieme ho pekne napasovať do stredu skrinky:
Keď si pozriete jeho Position súradnice v inšpektore, zistíte, že sú to pekné okrúhle čísla:
Máme teraz v scéne 5 dielov skrinky: spodok, vrch, dva boky a chrbat. Aby sme s nimi mohli narábať jednoduchšie, zoskupíme ich k sebe.
Existuje viacero stratégií, ako si organizovať nadradené a podradené objekty. Ja vám ukážem moju, iné sú možno lepšie.
Vytvorte nový prázdny game objekt. (Game Object->Create Empty) a pomenujte ho Skrinka.
Tento novovytvorený game objekt bude nadradený našim 5 dielom skrinky. Zároveň bude fungovať ako ich pivot, teda bod, okolo ktorého sa otáčajú, škálujú a ktorého pozícia je hlavná pre celé zoskupenie.
Presuňte game objekt Skrinka tam, kde chcete mať pivot skrinky. Ja som si ho dal do ľavého dolného rohu. Môžete tiež použiť prichytávanie na vrchol (V), aj keď prázdny objekt de facto žiadne vrcholy nemá.
Teraz presuňte v rámci panelu Hierarchy jednotlivé diely skrinky do Skrinky:
Diely sa stali podradené, vytvorili sme z nich hierarchiu. Stále sa dá hýbať každým dielom samostatne. Ale keď budeme hýbať Skrinkou, budú sa hýbať všetky s ňou.
Nastavte pozíciu Skrinky tak, aby bola v strede obrazovky, keď sa pozriete na Game okno:
Ozdobte skrinku nejakými materiálmi, nech nie je škaredá biela. Nezabudnite, že ten istý materiál môžete aplikovať na viacero game objektov. Nevyrábajte pre každý diel nový materiál, ak nepotrebujete.
Vytvorte skrinke dvierka, nazvite ich Dvierka. Zatiaľ dvierka nepresúvajte v hierarchii do Skrinky. Nechajte ich slobodné, bez nadradeného game objektu.
Keď skúsime teraz otvoriť dvierka pomocou rotácie, narazíme na to, že sa otáčajú okolo svojho pivotu, ktorý je defaultne v strede objektu:
Od dvierok očakávame, že sa otáčajú okolo nejakých pántov na kraji. Nie okolo stredu.
Vytvorte nový prázdny objekt, nazvite ho DvierkaContainer. Presuňte ho na pravý okraj dvierok:
A presuňte Dvierka v hierarchii pod DvierkaContainer:
Teraz, keď skúsite otáčať nadradeným game objektom DvierkaContainer (pozor, nie podradeným objektom Dvierka), budú sa dvierka oáčať okolo nového pivotu.
Doplňte do scény guľu (Sphere) a zariaďte, aby sa otáčala spolu s dvierkami:
Zaraďte DvierkaContainer ako potomka pod Skrinku:
Teraz už máme hierarchiu pozostávajúcu až z troch úrovní, napríklad: Skrinka > DvierkaContainer > Dvierka.
A vďaka tomu vieme otáčať aj celou skrinkou aj len dvierkami:
Zapúzdrenie objektu do kontajnera vytvára akúsi neviditeľnú krabicu, do ktorej môžeme dať viacero objektov (napríklad dosku dvierok a kľučku). S objektami potom možno manipulovať:
buď so všetkými naraz, keď manipulujeme s kontajnerom
alebo s každým individuálne, keď manipulujeme s objektom vnútri kontajnera.
Ďalšou výhodou je, že objekty môžeme vnútri kontajnera rôzne transformovať a kontajnera sa to netýka. Toto využijeme pri neposlušných modeloch, ktoré sa naimportujú zle otočené.
Ak ešte nemáte v projekte žraloka, naimportujte si ho:
Do prázdnej scény vložte z assetov žraloka:
Po vložení bude žralok orientovaný zle. Stojí na hlave. Bol vytvorený v softvéri, ktorý má os Z smerujúcu nahor (cez chrbtovú plutvu). Unity má Z os smerujúcu dopredu, preto žralok skončil položený tak, že jeho chrbtová plutva smeruje dopredu a nie nahor.
Zrotujte žraloka okolo osi X, aby ležal:
Importujte do projektu skript FishController:
Priraďte tento skript na žraloka:
Toto je skript, ktorý hýbe objektom smerom dopredu a náhodne s nim zatáča s ním. Simuluje to pohyb ryby. Skúste pustiť hru:
Prečo sa toto deje? Lebo skript FishController hýbe objektom dopredu. A dopredu je v Unity os Z. A ako sme si už ukázali, v tomto modeli os Z smeruje cez chrbtovú plutvu nahor. Preto sa žralok hýbe zle.
Opravíme to pomocou kontajnera.
Vytvorte nový prázdny game objekt, nazvite ho Zralok. Umiestnite ho do stredu žraloka. To bude náš kontajner.
Všimnite si, že tento nový game objekt má os Z (modrá) smerujúcu dopredu žraloka. Presne v tom smere, ako potrebujeme. Ak by to u vás bolo inak, tak zrotujte Zralok tak, aby modrá šípka išla dopredu k hlave.
A teraz zapúzdrime objekt žraloka, ktorý má zle nastavenú Z os dovnútra kontajnera Zralok:
Skript na pohyb rybou odstránime z modelu žraloka:
A pridajte na miesto toho skript na kontajner Zralok:
Tento kontajner už má os Z smerujúcu správnym smerom dopredu, takže skript bude kontajnerom hýbať dopredu. A keďže model žraloka máme zapúzdrený v kontajneri, bude sa hýbať s ním:
So žralokom sme urobili to, že jeho vlastné lokálne súradnice, ktoré boli zle orientované, sme schovali dovnútra kontajnera. Kontajner mal súradnice orientované správne, a tak sme už ďalej manipulovali len s kontajnerom.
Takto viete vyriešiť problémy, keď naimportovaný model:
Má zle orientované osi (ako napríklad žralok)
Má zle umiestnený pivot
Je zle naškálovaný. Je príliš veľký, alebo príliš malý alebo nepomerne natiahnutý.
Vždy takto neposlušný model napravte a potom zapúzdrite do kontajnera.
Ak by šlo len o statický model, ktorý nič nerobí, tak nemusíte riešiť žiadny kontajner. Ale mnohé skripty predpokladajú, že objekt je správne orientovaný a správne naškálovaný. Vtedy môžete naraziť na problém, ako napríklad teraz, keď sa žralok točil okolo úplne inej osi.
Úloha:
Vráťte sa k predošlej scéne/projektu, kde už máme žraloka aj s textúrou a morským dnom.
Odstráňte zo žraloka skript Rotator.
Zreprodukujte postup s kontajnerom a rozhýbte žraloka pomocou skriptu FishController.