02. Rozpohybovanie modelu

Pridáme na model animáciu otváranie dvierok. Zatiaľ len na tlačidlo, neskôr potom budeme otvárať dvierka klikaním priamo na ne.

Otvorte si svoj projekt alebo si stiahnite hotový: CupboardApp_01.zip

Náš model skrinky je (našťastie) rozdelený na časti, ktoré budeme vedieť rozpohybovať: zásuvku Door1 a dvierka Door2, Door3.

Animácie v Unity

Skôr ako vytvoríme prvú animáciu, nezaškodí mierny úvod do princípu fungovania animácií v Unity. Mechanizmus animácií v Unity sa skladá z 3 súčastí. Kým ich nemáme v projekte všetky a kým nie sú správne prepojené, tak sa nepohneme. Sú to tieto súčasti:

Animation (clip)

Asset, ktorý obsahuje samotnú animáciu s kľúčovými snímkami, teda definícia toho, v akom čase sa aký parameter má zmeniť na akú hodnotu. Vyzerá podobne, ako to poznáme z nástrojov 3DS Max, Maya, Cinema4D a podobne:

Animator (controller)

Asset, ktorý je niečo ako scéna pre animácie (klipy). Sú v ňom poukladané animácie, ktoré spolu súvisia a medzi nimi sú nastavené vzťahy, z ktorej animácie sa prechádza do ktorej a za akých podmienok.

Animator (component)

Komponent v inšpektore, pomocou ktorého je Animator Controller previazaný na konkrétny game objekt. Bez neho by animácie len tak sedeli v assetoch a nevedeli by, na ktorý game objekt majú byť aplikované.

Podrobnejší manuál k animáciám v Unity nájdete na oficiálnej stránke.

Aby sme mohli rozumne začať vyrábať animáciu otvorenia dvierok, začneme tým, že pridáme na dvierka Door2 komponent Animator. (Pozor, nepomýliť si ho s komponentom Animation, ktorý je zastaralý a v Unity straší už len z dôvodov spätnej kompatibility.)

Ďalej si v assetoch vyrobíme nový adresár Animations a v ňom vyrobíme nový asset typu Animator Controller. Pomenujme ho DoorAnimations. A keď sme už pri tom, vytvorme aj nový asset typu Animation a pomenujme ho OpenDoor:

Teraz už máme 3 hlavné súčasti. Môžeme ich prepojiť.

Priraďte v gameobjekte Door 2, na jeho komponente Animator, controller DoorAnimations do vlastnosti Controller:

Ďalej chceme umiestniť animačný klip OpenDoor do controllera DoorAnimations. Na to potrebujeme otvoriť animátor – keď poklikáte na DoorAnimations v assetoch, otvorí sa nové okno Animator.

Animátor je teda niečo ako scéna. Dá sa v ňom podobne ako v scéne zoomovať (kolieskom) alebo posúvať (stredným tlačítkom myši alebo ALT+ľavé tlačítko myši). Sú v ňom umiestnené rôzne stavy animácie a dajú sa ľubovoľne presúvať. Štandardne je tu stav Entry, stav Exit a stav Any State. My sem do tohto animátora pretiahneme z assetov animačný klip OpenDoor:

Klip OpenDoor sa automaticky prepojil na stav Entry, lebo je prvý, ktorý sme do animátora pridali. Keď budeme mať viac animácií, môžeme to zmeniť.

Prepojenie zo stavu na animáciu alebo z animácie na inú animáciu sa volá prechod (Transition), v našom animátore vidíme jeden taký prechod ako šípku medzi krabičkami Entry a OpenDoor. Budeme sa tomu venovať neskôr, teraz poďme už konečne niečo rozanimovať.

Moja prvá animácia

Ak je už na game objekte Door2 komponent Animator a už má priradený animátor DoorAnimations a v tomto animátore máme animáciu OpenDoor, môžeme otvoriť animáciu OpenDoor a editovať jej kľúčové snímky. Je to krkolomný postup, ale musíme s tým nejak žiť. Neskôr pochopíte, prečo je to takto zorganizované.

Poklikajte na asset OpenDoor, otvorí sa okno Animation.

Zatiaľ v ňom nie sú žiadne kľúčové snímky ani žiadne animované vlastnosti. Každú vlastnosť, ktorú chceme animovať, musíme do animácie pridať. Ak vám nesvieti tlačítko Add Property (ako mne), tak je to preto, že síce máme animáciu otvorenú, ale nemáme označený príslušný game objekt v scéne.

Uistite sa, že máte v scéne označený game objekt Door2.

Prečo animácia nevie, že chcem editovať Door2, keď sme predtým prácne pridávali na Door2 komponent Animator, do neho DoorAnimations a do nich OpenDoor animáciu?

Je to preto, že podobne ako napríklad ten istý materiál môže skrášľovať rôzne game objekty, tak aj tá istá animácia môže animovať rôzne game objekty.

Preto vždy, keď chceme animáciu editovať, Unity vyžaduje, aby sme mali označený nejaký game objekt. Inak by nevedela, aké všetky vlastnosti nám má ponúknuť na editovanie, keďže rôzne game objekty majú rôzne vlastnosti.

Teraz už tlačítko Add Property je prístupné a môžeme pridať vlastnosť Transform > Rotation, lebo budeme chcieť dvierkam animovať rotáciu.

Štandardne sa vytvorí 1 sekundu dlhá animácia s nulovými kľúčovými snímkami na začiatku a na konci úseku:

Jednotky na časovej osi tu vyzerajú ako sekundy a minúty. Ale nie sú. Sú to sekundy a snímky (frames). Jedna sekunda je rozdelená na 60 snímkov. Napríklad hodnota 0:55 neznamená 0 minút a 55 sekúnd, ale 0 sekúnd a 55 snímkov.

Kľúčové snímky je možné vytvárať aj manuálne, ale zatiaľ si vystačíme s nahrávaním. Zapnime teda v Animation okne nahrávanie kľúčových snímkov:

Časová os sa rozsvieti na červeno, aby sme vedeli, že nahráva. S počiatočným stavom dvierok sme spokojní, tak na začiatku animácie nepotrebujeme meniť nič. Ale chceme nastaviť koncový stav animácie, tak sa na časovej nastavme tam:

A pomocou inšpektora teraz nájdime takú polohu rotácie dvierok, ktorá nám ako koncová poloha vyhovuje:

Keď sme našli želanú hodnotu (mne sa páčilo 120 stupňov), vypneme v Animation okne nahrávací režim.

A môžeme odskúšať prehrať animáciu:

Hotovo. Animácia vytvorená. Môžeme skúsiť pustiť hru, čo to urobí. Dvierka sa po spustení hry samé otvoria:

Prečo sa otvárajú samé, keď my chceme, aby sa otvárali na stlačenie buttonu? Za to môžu animačné stavy v animátore.

Stavy animácie

Vráťme sa teraz do animátora (poklikať na asset DoorAnimations v assetoch):

Každý škatuľka tu predstavuje nejaký stav alebo animáciu. Stav Entry je preddefinovaný, nejde ani vymazať a je to stav, z ktorého sa príslušný animovaný objekt rozbieha. Tento stav musí vždy niekam pokračovať, preto keď sme do animátora pridali animáciu OpenDoor, tak sa automaticky pripojila na Entry. Toto defaultné prepojenie je vyznačené oranžovou farbou a nejde ani odstrániť.

Ak nechceme, aby po naštartovaní animátor prešiel automaticky do OpenDoor, musíme mu do cesty strčiť nejaký prázdny stav, ktorý nič nerobí.

Kliknime pravým tlačítkom do prázdnej plochy v animátore a vyberme Create State > Empty. Vznikne nový stav s názvom New State. Označme ho a cez inšpektor ho premenujme na DoNothing. Teraz ho môžeme označiť, že on má byť ten defaultny stav a nie animácia OpenDoor: Klikneme pravým tlačíkom na stav DoNothing a vyberieme Set as Layer Default State. (Zatiaľ sa netrápte tým, čo tu znamená „Layer“, k tomu sa asi ani nedostaneme.)

Šípka z Entry sa presunula do DoNothing a keď spustíme hru, tak už sa dvierka samé neotvárajú.

Spustenie animácie

Unity pozná viacero spôsobov ako spustiť animáciu. Jeden sme už videli: Animácia sa prehrá automaticky, ak je napojená na Entry stav. Keby bola na takú animáciu pomocou šípok v animátore napojená ďalšia, prehrá sa automatický po nej tá a tak ďalej.

Ďalší spôsob je spustiť animáciu na základe nejakej udalosti. To môže byť nejaká aktivita používateľa – napríklad keď hráč stlačí kláves pre vyskočenie, prehrá sa animácia skoku. Alebo to môže byť nejaká zmena v stave hry – napríklad keď zdravie hráča klesne na nulu, prehrá sa animácia smrti postavičky. My v tomto momente využijeme obyčajný button a napojíme prehranie animácie na neho.

  • Pridajte do scény nový button (pridať nový game objekt, UI, Button )
  • Nazvite ho OpenButton
  • Zmeňte text v buttone na „Open„: Novovytvorený game objekt OpenButton má potomka Text a ten má komponent Text a v ňom je vlastnosť Text)

Následne pridáme buttonu v jeho komponente Button novú akciu do On Click:

Ktorému game objektu má button rozkazovať? Dvierkam Door2. Preto natiahneme game objekt Door2 do akcie:

A keďže chceme, aby sa na stlačenie prehrala animácia, vyberieme ako komponent Animator a z neho metódu Play(string):

Metódu Play(string) sme vybrali preto, že animáciu, ktorú chceme prehrať, budeme identifikovať podľa názvu (názov je text a texty sú stringy). Je tam aj metóda Play(int), ale tú teraz nevyužijeme.

Ostáva vyplniť do akcie parameter pre metódu Play – názov našej animácie OpenDoor:

Takto vyplnená akcia teda hovorí, že po stlačení buttonu sa má pre objekt Door2 na jeho komponente Animator zavolať metóda Play s parametrom OpenDoor.

Spustíme hru a vidíme, že dvierka sa už otvárajú na stlačenie buttonu.

Na domácu úlohu

  • Vytvorte na game objekte Door2 novú animáciu CloseDoor
  • Pridajte ju do animátora DoorAnimations
  • Nastavte jej kľúčové snímky tak, aby zatvárala dvierka. (Treba si uvedomiť z akej hodnoty rotácie začína zatváracia animácia a na akej hodnote končí.)

Pozor! Ak je na jednom game objekte viac animácií, uistite sa, že editujete kľúčové snímky tej správnej animácii:

  • Dorobte button na zatváranie dvierok a nastavte mu správne akciu na prehranie animácie CloseDoor.

Hotový projekt na stiahnutie: CupboardApp_02.zip