Skip navigation

Animációk közötti váltások

Animátor ablak

Az animációk megléte után be kell állítanunk, hogy mikor melyik animációnek kell működnie. Tegyük fel, hogy a Ninja karakterünk három dolgot tud. Futni, álldogálni, és ugrani. Ezekhez mind létrehozhatunk külön-külön animációkat.

Ha megvannak az animációk, akkor azok között az összefüggéseket az animátor ablakban állíthatjuk be. Ezt az ablakor megtaláljuk a "Window menü -> animation -> Animator" menüpontjában.

An animátor ablak felépítése

Állapotok és átmenetek

Az animációk között váltásokhoz a Unity ad nekünk egy "állapot gráfot". Az animátor ablakban úgynevezett állapotokat látunk. Minden animáció, ami az objektumunkhoz tartozik egy-egy állapot. Az állapotok között pedig van egy "aktív állapot". A képernyőn az az animáció látszik, amelyiknek aktív az állapota. Innentől csak azt kell meghatároznunk, hogy mikor melyik állapot (vagy animáció) legyen aktív.

Az állapotok közötti váltást átmenetekkel tudjuk vezérelni. Amíg a program fut, addig minden pillanatban van egy aktív állapot. Ha le akarjuk cserélni az animációt, akkor létre kell hoznunk egy szabályat, ami alapján az egyik aktív állapotból átjutunk a másikba. Erre lentebb láthatunk majd példát.

Ehhez kapocsolódik, hogy az ablakon látszik két speciális állapot is. Ezek:

  • Entry: A kezdőállapot. Amikor a program alindul, akkor ez az aktív állapot, de a program indításakor azonnal átadjuk az "aktív státuszt" annak az állapotnak, ahova a Entry-ből nyíl mutat. (Jelen esetben ez a Ninja_run állapot.)
  • Any state: Később látni fogjuk, hogy hogyan működnek az állapotok közötti átmenetek. A program futása során mindig az egyik állapotból a másikba megyünk át valamilyen feltétel alapján. Ha például a karakterünk ugrik (vagyis elemelkedik a földtől) akkor az aktuális állapotunkból át kell jutnunk a "Ninja_jump" állapotba. Ezt az átmenetet akkor is meg kell tennünk, ha éppen futottunk, vagy ha ugrottunk, tehát két állapotból juthatunk az ugrás állapotába, ugyanannak a feltételnek az alapján. Az any state állapot egy egszerűsítést ad nekünk. Ez azt jelenti, hogy egy adott feltétel teljesülése esetén bármely állapotból jussunk a megadott állapotba. Hetát csak egy átmenetet kell megadnunk kettő helyett.

Kezdőállapot kiválasztása

A kezdőállapot kiválasztásához csak az egér jobb gombjával rá kell kattintanunk a kiválasztott állapotra, és használni a "Set as Layer Default State" gombot.

Kezdőállapot kiválasztása

Átmenet készítése

Az állapotok közötti átmenetek késztéséhez rá kell kattintanunk a az egér jobb gombjával a kezdőállapotra (ahonnan indul az átmenet). Ilyenkor az egeret követni fogja egy átmeneti nyíl vége, amivel rá kell kattintani a cél állapotra.

Az esetünkben hozzunk létre egy átmenetet a "Ninja_stand" állapotból a futás állapotba.

Animációk közötti átmenet készítése

Átmenetek paraméterei

Az állapotok közötti váltást feltételekhez fogjuk kötni. A feltételeket pedig változókhoz fogjuk kötni.

Az álldogálásból a futás nimációjába való átmenetet például köthetjük olyan feltételhez, hogy a karakter sebessége nagyobb legyen, mint 0. Ennek alapján ha a játékos elindul, akkor automatikusan aktiválva lesz a futás animációja, tehát nem csak a taláán csúszik, hanem mozgatja közben a lábát.

Első lépésben a változókat a animátor ablak bal felső részén tudjuk beállítani. A "Parameters" fület választva a kis "+" jellel jellölt menüben tudunk hozzáadni különböző típusú változóktat. Hozzunk is létre kettőt.

  • Egy float típusút "Speed" - vagyis sebesség - névvel,
  • És egy Bool típusút "Jumping" - vagyis "éppen ugrik" - vnévvel.

Változók megadása az animátorban

Paraméterek beállítása

Ha megvannak az átemenetek, és a paraméterek is, akkor még be kell állítani az átmenet paramétereit. Ezt az Inspector ablakban tehetjük meg, ha az egér bal gombjával kiválasztjuk az átmenetet szimbolizáló nyilat.

Átmenet paramétereinek megadása

A jelen átmeneten három dolgot kell átállítani.

  • Ki kell kapcsolni a "Has Exit Time" paraméter. Ez azt modnaná meg, hogy az átmenet automatikusan lefut, de cak egy adott késleltetéssel.
  • 0-ra kell állíteni a "Transition Duration" paramétert. Ezzel az átmenetet folytonossá lehetne tenni adott idő alatt, de esetünkben ez felesleges.
  • Alul a "Conditions" menücsoportoban a "+" jellel hozzá kell adni egy új átmeneti felétételt.
  • A feltételnek be kell állítani, hogy "Speed", "Greater" és "0", vagyis akkor váltunk aktív állapotot, ha a sebesség nagyobb, mint 0.

Ezzel már majdnem megvan az első átmenetünk. A feltételek alapján ha karakter ácsorog, de a sebessége nagyobb, mint 0, akkor automatikusan átvált a futó animációra.

További átmenetek

Ha már az átmeneteknál járunk, akkor állítsunk be még néhány átmenetet.

Egyet a futásból vissza az állásba.

Futásból Állás

Egyet az "Any state"-ből az ugrásba.

Ugrás aktiválása

És egyet az ugrásból az állásba.

Ugrásból állás

A fenti átmenetek logikája ez lesz:

  • Kezdetben álldogálunk. Ez van ha elindul a játék.
  • Ha álldogálás közben a sebességünk 0 fölé megy, akkor alindultunk, mehet a futás animáció.
  • Ha futás közben a sebességünk kicsi lesz (kisebb, mint 0.001), akkor megálltunk, tehát ácsorgás animáció.
  • Ha bármikor elemelkedünk a föltdől, akkor aktiváljuk az ugrás animációt. Értelemszerűen, ha nincs a lábunk a földön, akkor nem tudunk sem állni, sem futni.
  • Ha újra a földre kerülünk, akkor automatikusan állunk.
  • De mi van, ha a földte érés után futni lendületben vagyunk, és futni kellene? Az megoldódik magától, mert ekkor az ugrás után az állás állapotába kerülünk, de mivel a sebességünk nagyobb 0-nál, ezért azonnal megy tovább az aktív állapot a futásba.

Az animácók beállításával majdnem készen is vagyünk. Most még nem fog működni a dolog, mert kódolnunk is kell a programban, de jól halafunk.

Animáció vezérlése Scriptekből

Ahhoz hog az animációnk működjön még végezetül be kell állítani az animátor paramétereit. Említettük, hogy az aktív állapot lecserélése paraméterekhez és feltételekhez között. Ezeket a paramétereket a scriptjeinkből tudjuk beállítani.

Térjünk vissza a PlayerController scriptünkhöz, és az Update függvényt egészítsük ki az alábbiakkal:

public class PlayerController : MonoBehaviour
{

    ...

    // Update is called once per frame
    void Update()
    {
    
        ...

        float currentSpeed = Mathf.Abs(rb.velocity.x);
        GetComponent().SetFloat("Speed", currentSpeed);

    }

    ...

}

Ebben a kódban lekérdezzük a Rigidbody komponensünk velocity.x paraméterét. Ez egészen pontosan a vezszintes lendülete a játékosnak, tehát a mozgási sebessgée jobbra-balra. Az érték lehet negatív, vagy pozitív is, így ha csak a sebesség mértékére vagyunk kiváncsikat, akkor az abszolút értéket kell venni a Mathf.Abs(...) beépített függvénnyel.

Ha megvan a sebesség mértéke, akkor meg kell keresnünk az játékos "Animator" komponensét, amin a SetFloat(...) függvény segítségével beállíthatjuk a Speed paraméter értékét.

Figyeljünk, arra is, hogy a C# programozási nyelv megkülönbözteti a kis és nagybetűket. A SetFloat függvényben az első paraméter a beállítandó paraméter neve. Ezt Pontosan kell megadnunk!!!

A teljes script egyben megtalálható ezen a linken.

Ugrás vezérlése

Az ugrás vezérlése sajnos sokkal bonyolultabb feladat. A kód maga nem bonyolult, az alábbi részletben látható:

public class PlayerController : MonoBehaviour
{

    ...
    
    public Transform talp;
    public float talpMeret = 0.2f;
    public LayerMask miATalaj;

    // Update is called once per frame
    void Update()
    {
    
        ...

        bool foldonAll =
            Physics2D.OverlapCircle(
                talp.position,
                talpMeret,
                miATalaj);

        GetComponent().SetBool("Jumping", !foldonAll);

    }

    ...

}

Itt először is kell három globális változó. A programunk arra fog alapulni, hogy megnézzük a karakter talápának egy kis környezetében, hogy találunk-e ott más tárgyat. Ha igen, akkor a füldön állunk, ha nem akkor a levegőben vagyünk.

Ehhez viszont kell három paraméter.

  • talp: A talp pozícika,
  • talpMeret: hogy mekkora környezetben vizsgáljuk az ütközést,
  • miATalaj: amivel megadjuk, hogy mi a talaj. Ez ezért kell, mert a talp közelében mindig van egy objektum, ami maga a játékos. Ügyelnünk kell, viszont hogy az nem számít, tehát ki kell tudnunk válogatni, hogy mi számít talajnak. Ehhez úgynevezett rétegeket fogunk használni.

A baálliítás kicsit hosszadalmas, és két részből áll.

Talp pozíciójának megadása

Először létre kell hoznunk egy objektumot, ami megmondja, hogy hol van a talp. Ez egy üres objektum lesz, ami a játékos gyermeke. Az ilyen objektumnak van pozíciója, de nem jelenik meg tehát tökéletes egy pozíció megadására. Ezen kívül mivel a játékos gyermeke ezért mindig követi a játékost, vagyis, ha lerajuk a Ninja lábához, akkor mindig ott is marad.

A létrehozáshoz először a Játékos karakteren kell jobb gombbal kattintani, és a "Create Empty menüpontot választani"

Talp létrehozása

Ezek után érdemes beállítani egy jölölőt a talpnak, hogy lássuk a pozíciója. Ilyen (a játékban nem látszódó) jelölőt az Inspector ablak bal felső sarkában tudunk beállítani.

Talp pozíciójának jelölője

Ha ezzel megvagyunk, akkor el kell helyezni a talpat a megfelelő helyre.

Talp pozícionálása

És végül be kell álíltani a játékos vezérlő scripjén, hogy mi a talp.

Talp megadása a játékosvezérlőn

Rétegek beállítása

Ahogy korábban említettük azt, hogy mi is a talaj, amirea  játékos rá tud állni rétegek segítségével különíthetjük el. A rétegek a Unity-ben csoportosító elemek. Funkciója szerint a GameObject-eket rétegekbe szervezhetjük.

Ehhez először létre kell hozni a megfelelő réteget. Ehhez válasszunk ki egy talaj elemet, és az inpector jobb felső sarkában a Layer menüben hozzuk létre az új réteget.

Réteg létrehozása

A listában meg tudjuk adni az új réteg nevét

Új réteg neve

Ha megvan a réteg neve, akkor meg kell azt adni az objektumoknak. Gyorsíthatunk a dolgon, ha ea hierarchia ablakban gyszerre kijelölünk minden talaj elemetl és egyben megadjuk a rétegüket.

Réteg beállítása a GameObject-en

Végül pedig vissza kell mennünk a játékos vezérlő Script-jére és megadni, hogy mi számít talajnak.

Talaj rétegének megadása

Ha mindent jól csináltunk, akkor inentől mőködnie kell programnak.