04. Kopírovanie animácií
Na rozpohybovanie ostatních častí skrinky budeme potrebovať vytvoriť ďalšie animácie a rovnako ich spúšťať na kliknutie. Aby sme sa nenadreli, ukážeme si niekoľko spôsobov, ako si uľahčiť život.
Otvorte si svoj projekt alebo si stiahnite hotový: CupboardApp_03.zip
Momentálne máme medzi assetmi animáciu CloseDoor na zavretie dvierok, animáciu OpenDoor na otvorenie dvierok a spoločný animator controller DoorAnimations:

Tieto boli všetky vytvorené pre ľavé dvierka na skrinke. Nemôžeme ich v tejto podobe použiť na pravé dvierka, pretože tie sa otvárajú do opačnej strany. Budeme pre pravé dvierka vytvárať nové animácie, ale pomôžeme si týmito existujúcimi. Aby sa nám nemotali, začnime tým, že existujúce animačné assety premenujeme. (F2 alebo Pravé tlačítko > Rename) na LeftCloseDoor, LeftDoorAnimations a LeftOpenDoor:

Otvorme teraz controller LeftDoorAnimations (stačí na neho poklikať v assetoch). Toto je controller, do ktorého sme minule umiestnili animačné assety pre otvorenie a zatvorenie dvierok. Teraz sme tieto animačné assety premenovali, ale aha:

Hoci v assetoch sa už animácie volajú LeftCloseDoor a LeftOpenDoor, v controlleri sa naďalej volajú OpenDoor a CloseDoor. Prečo?
Animator Controller je niečo ako scéna pre animácie. Umiestňujú sa tam assety (animácie) podobne ako sa do 3D scény umiestňujú assety (3D objekty). Môžeme nimi po umiestnení do animátora pohybovať a môžeme im aj dať mená rôzne od assetov, z ktorých boli vytvorené. Mená v animátore sú nezávislé od mien v assetoch. Preto aj pri premenovaní assetov sa mená v animátore nezmenili.
Jeden animačný asset môže byť umiestnený v rôznych animátoroch pod rôznymi názvami. A naopak: Dve rôzne animácie môžu mať v rôznych animátoroch ten istý názov. A práve túto vlastnosť – mať rôzne animácie s rovnakým názvom – teraz využijeme.
Spomeňme si, ako pri kliknutí voláme animáciu na otvorenie dvierok:
hit.transform.gameObject.GetComponent<Animator>().Play("OpenDoor");
Keby sme už mali vytvorenú animáciu pre otvorenie pravých dvierok, museli by sme sa v tomto bode kódu rozhodovať. Ak bolo kliknuté na ľavé dvierka, pusti animáciu pre otvorenie ľavých dvierok. A ak bolo kliknuté na pravé dvierka, pusti animáciu pre otvorenie pravých dvierok. O-tra-va!
My to práve urobíme tak, aby nášmu skriptu bolo úplne jedno, na ktoré dvierka sa kliklo. Pre ľavé aj pravé dvierka urobíme dva rôzne animátory. V každom budú príslušné animácie pre otvorenie a zatvorenie. Ale pokiaľ budú v jednom aj v druhom animátore pomenované univerzálne „OpenDoor“ a „CloseDoor„, tak skript bude fungovať bez nutnosti zmeny.
Skript sa len pozrie do animátora toho objektu, na ktorý sme klikli, a prehrá z neho animáciu s názvom „OpenDoor„. Skriptu je jedno, ktorý animačný asset za touto animáciou stojí a ako sa volá v origináli
Poďme na to.
Kopírujeme animácie
Zduplikujme asset LeftDoorAnimations: Označiť asset a buď Edit > Duplicate alebo CTRL+D. Vznikne nový asset s názvom LeftDoorAnimations1. Premenujme ho na RightDoorAnimations.
Rovnako zduplikujte aj animácie LeftCloseDoor a LeftOpenDoor

Keď si teraz otvoríme animátor RightDoorAnimations, zistíme, že vyzerá rovnako ako LeftDoorAnimations:

Niet divu, keďže sme ho zduplikovali z animátora LeftDoorAnimations. Obsahuje už aj animácie OpenDoor a CloseDoor.
Ale pozor! Tieto animácie OpenDoor a CloseDoor odkazujú na animačné assety pre ľavé dvierka. Môžeme sa o tom presvedčiť, keď si označíme animáciu OpenDoor v animátore a pozrieme do jej inšpektora:

Ak cheme, aby odkazovali na správne animačné assety RightOpenDoor a LeftOpenDoor, tak stačí keď do inšpektora do vlastnosti Motion pretiahneme príslušné animačné assety pre OpenDoor aj CloseDoor animácie:

V tomto momente už teda máme 2 nezávislé animátory: Ľavý a pravý. A v každom máme jednu animáciu na otvorenie a jednu na zatvorenie dvierok. Môžeme teda pravý animátor aplikovať na pravé dvierka:
- Pridajte na game objekt Door3 komponenty BoxCollider, Animator a DoorStatus
- Komponentu Animator nastavte v inšpektore ako controller asset RightDoorAnimations
Uložiť, spustiť a vyskúšať:
Ups. Pravé dvierka sa otvárajú naopak. Prečo?
Pretože je to animácia s kľúčovými snímkami a my sme ju skopírovali z ľavých dvierok. Musíme teda upraviť hodnoty na začiatku a na konci animácií pre pravé dvierka.
Upravujeme skopírovanú animáciu
Otvorme si animačný asset RightDoorOpen. Stačí na neho poklikať v assetoch, otvorí sa okno Animation:

Sú tu dva kľúčové snímky, ešte z pôvodnej ľavodvierkovej animácie:

Rotácia okolo y začína na hodnote 0 a končí na hodnote 120:

Ak chceme, aby sa dvierka pri otváraní otočili do opačného smeru, stačí, ak 120 prepíšeme na -120 v poslednom snímku animácie.
Podobne upravte animáciu RightCloseDoor, tam treba prepísať prvý snímok
Teraz už dvierka poslúchajú ako majú:
Poučenie
Čo je podstatné si uvedomiť – a môže to byť trochu mätúce – je, že animačný asset (niekedy sa volá aj motion) nie je to isté ako animácia v animátore. Keď umiestnime animačný asset do animátora, vznikne inštancia tejto animácie. Podobne ako keď sa z prefabu vytvára game objekt. Táto animačná inštancia môže mať svoje meno, ktoré je nezávislé od mena assetu.
Túto vlastnosť vieme využiť na to, že dve rôzne animácie (napr. otvorenie ľavých dvierok a otvorenie pravých dvierok) majú v animátoroch rovnaký názov. Vďaka tomu náš skript, ktorý sme si pôvodne vytvorili na otváranie ľavých dvierok, funguje rovnako dobre aj na pravé dvierka. Pretože jedna aj druhá animácia sa vo svojich príslušných animátoroch volajú rovnako OpenDoor.
Domáca úloha
- Vytvorte otváranie aj pre zásuvku – game objekt Door1. Rozdiel je v tom, že u zásuvky nebudeme animovať rotáciu okolo Y, ale pozíciu v smere X.
- Nezabudnite na zásuvku pridať potrebné komponenty, aby fungovalo klikanie na ňu aj aby si pamätala svoj otvorený/zatvorený stav.
Ak vám do animácie nejde pridať vlastnosť Transform.Position, tak je to preto, že nemáte označený príslušný game objekt (Door1).
Hotový projekt na stiahnutie: CupboardApp_04.zip
