A Unity animációs rendszere képes arra, hogy bármilyen GameObject bármelyik komponensének bármelyik Inspector felületen elérhető paraméterét valós időben változtassuk egy vagy több előre felvett animáció szerint.
Animator komponens és Animator Controller
Ahhoz, hogy egy GameObject-et és annak minden gyerekét animálni tudjuk szükség van egy Animator komponensre az adott GameObject-en.
Ezután a Animator komponensen be kell állítani az Animator Controllert. Ehhez létre kell hoznunk az említett Animator Controller fájlt majd utána manuálisan behuzalozni a Controllert a komponensbe.
Egy Animator Controller-hez több animáció is kapcsolható. A Controller fájl tartalmazza az adott GameObject minden animációját és azok kapcsolatát, amit egy (vagy több) úgy nevezett állapotgép ír le.
Az Animator komponens tartja számon az animálandó GameObject példány állapotát és vezényli az animálást. Az Animator Controller file csupán az animáció bizonyos beállításait tartalmazza.
A Unity animációs állapotgép
Egy igen egyszerű informatikai fogalom. Egy állapotgép egy olyan rendszert ír le, ami több jól elkülönülő állapotban létezhet. Az állapotok közül mindig egy aktív.
A Unity animációs állapotgép állapotai különböző animációk. Mindig az aktív állapot az aktuálisan lejátszott animáció.
A Unity animációs állapotgép állapotai közti váltás automatikusan történik előzetes beállítás után. Ahhoz, hogy a váltás megtörténjen előre definiálni kell Transition-öket (átmeneteket).
Minden átmenethez feltételeket rendelhetünk, amik ha teljesülnek, akkor automatikusan megtörténik a váltás, ám fontos, hogy mindig csak az aktív állapotból tudunk tovább lépni egy másikra.
A feltételek logikai (eldöntendő) kifejezések, amiket előre definiált (float, int, bool vagy trigger típusú) paraméterek értékei befolyásolnak.
A paramétereket kódból van lehetőség állítani.
A fentiek könnyebb megértéséhez hozok egy példát:
A képen egy Unity Animator Controller látható. Ahhoz, hogy mindehhez hozzáférjünk meg kell nyitni az Animator ablakot (Window / Animation / Animator) és ki kell jelölni egy Animator Controller filet vagy egy olyan GameObject-et, amin van Animator és annak van bekötött Controller-e.
Jobb oldalt látszik az állapotgép. A kezdőállapot mindig narancs színnel van jelölve. A fenti példán az “Idle” (Ácsorgás) nevet viselő állapot a kezdőpont. Ez lesz aktív az animátor aktiválásakor (Start). Ezen kívül két egyéb állapot van felvéve: “Walk Slow” (Lassú gyaloglás) és “Run Fast” (Gyors futás). Mindhárom állapotból van egy-egy átmenet a mási kettőbe. Ezeket az átmeneteket a fehér nyilak reprezentálják. Ahogy a fenti állapotokat, a Transition-öket is manuálisan kell felvenni.
Három egyéb állapot (téglalap) is látszik a képernyőn: “Any State” (Bármely állapot) és “Entry” (Belépés) és “Exit” (Kilépés). Ezek minden Unity állapotgép kötelező elemei, de velük most nem foglalkozunk.
Bal oldalon láthatók a paraméterek. Új paramétert a fölöttük lévő + gombbal lehet felvenni. A felvett paramétereknek ki kell választani a típusát, kell nekik adni egy nevet és beállíthatunk kezdőértéket. A paraméterek valójában a programozási változók vizuális megfelelői a Unity animációs rendszerében.
A példa egy karaktert ír le, ami tud egyhelyben állni, sétálni és futni és ezen animációk automatikusan váltakoznak a következő paraméterek hatására: Speed (float) és IsStanding (bool).
Ezen paraméterek aktuális értéke fogja befolyásolni, mikor melyik Transition fog megtörténni azaz miként változik az aktív állapot. Ehhez nézzük meg a Transition-ök beállításait azzal, hogy rákattintunk.
A fenti képen ki van emelve 3 állapotváltás feltételei. Ha a feltételek mindegyike teljesül egy olyan Trasition-ön, ami az aktív állapotból lép ki, akkor megtörténik a váltás.
Egy egyéb feltétel is adható a paraméterek felhasználásán kívül minden átmenethez. A transition beállításai között található egy kiválasztható mező: Has Exit Time. Ha bejelöljük ezt a lehetőséget, azzal jelezzük, hogy ezen átmenet csak bizonyos részein az animációnak történhet meg. Ennek részletes beállításai in a Trasition Inspector felületén elérhetőek.
Az animációk közti váltás nem feltétlenül pillanatszerű. A váltás pontos beállításait a Transition inspector felületén lehet elérni. A nem pillanatszerű váltások esetén két animáció összemosható, azaz a számértékek (mint pl. pozíció) folyamatosan csúsznak át egyikből a másikba.
A paramétereket szkriptből lehet módosítani az Animator komponensen keresztül a következő módon:
Animator animator = GetComponent<Animator>();
// ...
animator.SetBool("BoolParameterName", true);
animator.SetInteger("IntParameterName", 2);
animator.SetFloat("FloatParameterName", 0.75f);
animator.SetTrigger("TriggerParameterName");
A bool, int és float típusok ismerősek lehetnek már programozásból. A trigger paraméter az egyetlen, amivel még nem találkozhattunk. A trigger egy eseményt jelképez. Nem lehet neki értéket beállítani csak “elsütni” a fent bemutatott SetTrigger függvénnyel. Használatára jó példa lehet egy kardcsapás: Ha megnyomjuk az X gombot, akkor süssük el a “DoSlice” Triggert, aminek hatására lépjünk át a “Slice” állapotba és játszódjon le a kardcsapás animáció.
Az animációs fájlok és az Animation ablak
Ahhoz hogy egy aktív állapotnak bármi hatása legyen a GameObject animációjára, létre kell hozni és manuálisan csatlakoztatni egy Animation file-t a State-hez (állapothoz). Minden állapothoz csakis egy animáció tartozhat, de létezhet állapot animáció nélkül is.
Egy Animation file tartalmazza egy időskálán az összes változást, ami a hozzá tartozó GameObject-en és annak gyerekein eszközöl.
Alapvetően két féle animáció van, az egyszer végrehajtandó, mint például a kardcsapás és a ciklusosan ismétlődő, mint például a futás. Hogy egy animációs fájl a kettő közül hogyan működjön azt az Animation fájlon lehet beállítani.
Animációs fájl szerkesztéséhez és előnézetéhez meg kell nyitni az Animation ablakot (Window / Animation / Animation) és ki kell jelölni egy Animation filet vagy az animálandó GameObject-et. Utóbbi esetben bal oldalt fent a Preview gomb alatt választhatunk az elérhető animációk közt.
Az ablak bal oldali részén vannak felsorolva az animáció által módosított információk. Jobb oldalt helyezkedik el az idővonal, amit két módban lehet használni: Dopesheet és Curves. A két, mód közt a baloldali menü alján válthatunk.
Dopesheet módban látjuk a különböző kulcs képkockákat azaz keyframe-eket: pontosan milyen paramétereken milyen változtatást hajtunk végre és mikor.
Curves módban látjuk a számmal leírható animált információk változását görbe formában a kulcskockák között is.
A Unity animáció nem csak a Transform komponens információit képes módosítani hanem bármely egyéb komponens bármely egyéb inspector felületről elérhető paraméterét. Lehet ez akár egy collider ki-be kapcsolása, egy SpriteRenderer-rel kirajzolt kép, egy MeshRenderer Material-ja vagy akármilyen MonoBehaviour akármelyik SerializeField beállítása.
Ha belekattintunk az idővonalra vagy megnyomjuk a preview gombot, átlépünk előnézeti módba. Ekkor bármelyik időpillanatát megtekinthetjük az animációnknak.
A play gombbal le is játszhatjuk.
Felvenni animációt a kerek, piros Record gombbal lehet. Ekkor átlépünk record módba. Ekkor bármilyen információ módosítása a GameObject-en az animáció része lesz.
Animációs események
A baloldali menü jobb felső részén helyezkedik el az Animation Event gomb (vastag függőleges vonal és egy plusz jel). Ezzel olyan pontokat tudunk elhelyezni az animációban, amikhez, ha elér az animáció futása meghív egy publikus metódust bármely MonoBehaviour-on ami azonos GameObject-en van, mint az Animator. A meghívandó metódus az event-re kattintva választható ki az inspector felületen.
Animációs gyorsbillentyűk
Ezek a gyorsbillentyűk kifejezetten csak az Animation ablakban működnek:
Play Animation | Space |
Előző Frame | Vessző |
Következő Frame | Pont |
Előző Keyframe | Alt + Vessző |
Következő Keyframe | Alt + Pont |
Első Keyframe | Shift + Vessző |
Utolsó Keyframe | Shift + Pont |
Új Keyframe | K |
Többi gyorsbillentyű: Unity gyorsbillentyűk