Skip navigation

Játékos mozgatása

Attekintés

Elég az elméletből, végre belekezdhetünk a játékos vezérlőscriptjének megírásába. A programot részleteiben fogjuk átnézni. A teljes kód egyben, megtalálható az oldal alján, vagy Ezen a linken.

Kapcsolódás a többi komponenshez

A scriptünk első dolga, hogy kapcsolódnia kell a többi komponenshez. A játékos mozgatásáért edig a RigidBody2D komponens felelt. Mi is ennek a komponensnek küldönk majd üzeneteket, hogy mozogjon a karakter. Ezeken kívül szükségünk lesz még a Transform komponens elérésére és egy logikai változóra, ami meghatározza, hogy jobbra néz-e éppen a játékosunk.

A többi komponens elérésére van egy "GetComponent<típus>()" nevű függvény, amivel az objektumunk bármelyik komponensét lekérdezhetjük, aminek tudjuk a típusát.

A Start függvény ennek fényében az alábbi módon néz ki.

    private Rigidbody2D rb;
    private Transform tr;

    public bool facingRight = true;

    // Start is called before the first frame update
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
        tr = GetComponent<Transform>();
    }

A komponens egyszerűbb kezelése érdekében létrehoztunk egy privát változót amiben letároljuk a Rigidbody2D komponensük referenciáját. Innetől kezdve az osztályon belül a merevtest fizikai komponensünkhöz a "rb" adattagon keresztül bárhol kényelmesen hozzáférhetünk.

Jobbra-Balra mozgás megvalósítása

A mozgás megvalósítésa az Update függvényben kezdődik.

Először is le kell kérdeznünk, hog ya felhasználó akar-e jobbra, vagy balsa menni.

float irany = Input.GetAxis("Hoprizontal");

Ehhez elég annyit tennünk, hogy az Input.GetAxis(...) függvénnyel lekérdezzük a vízszintes tengely aktuális értékét, és letároljukazt egy változóba.

Ezek után már csak a mozgást kell megoldanunk. A mozgáshoz használhatjuk a RigidBody2D komponensünket. Annak van ugyanis egy AddForce() függvénye, amivel erőt tudunk adni a karakternek. Ez az alábbi módon történik.

        Vector2 eroVector = new Vector2(irany * speed, 0.0f);

        rb.AddForce(eroVector);

Az első lépésünk, hogy ki kell számolnunk egy erő vektort, ami megadja, hogy hogyan szertnénk elmozdítani a játékost. Ez egy két komponensű irányvektor, aminek van iránya, és nagysága is. Az irány most z x tengelyen a vízszintes input tengely nagysága, megszorozva a sebességgel. A számítás egyszerű, mert a vízszinte input tengely egybeesik a játéktér koordinátarendszerének "x" tengelyével. Az "y" tengely mentén nincs elmozdulás, most csak jobba-balra mozgunk.

Ha a a játékot elindítva a karakter nem mozdulna meg a jobbra-balra gombok hatására, akkor sem kell megijedni. A tapasztalatok azt mutatják, hogy legalább 10-es sebességet kell beállítani a karakternek, hogy elinduljon.

A programban meg kel viszont még oldanunk, hogy a karakter arra nézzen, amerre megy.

Először nézzük meg azt, hogy mikor kell a karakternek megfordulnia. Ez egyszerű, ha más irányba halad mint amerre néz, tehát

        if(facingRight && irany < 0.0f)
        {
            flip();
        } else if(!facingRight && irany > 0.0f)
        {
            flip();
        }

A fenti kód meghív egy flip() nevű függvényt, ha a karakter jobbra megy, de balra néz, vagy fordítva. A flip() egy salyát függvényünk, aminek feladata, hogy megfordítsa a játékost.

    void flip()
    {
        Vector3 regiSkala = tr.localScale;
        regiSkala.x *= -1;
        tr.localScale = regiSkala;

        facingRight = !facingRight;
    }

Ugrás

A játékos ugrásának kódja kicsit hasonlít is a korábbira, de különbözik is a jobbra-balra haladástól. A jobbra, balra haladásnak iránya is volt. Az ugrás ilyen szempontból egyszerűbb, egy gomb lenyomására felfelé mutató erőt kell adni a játékosnak.

A gombot most egy másik módszerrel fogjuk ellenőrizni. Az Input.GetButtonDown() függvénnyel rá  tudunk kérdezni, hogy egy adott tengelyen történt-e billentyűlenyomást (pozitív vagy negatív is). Ez a függvény csak egy igaz/hamis értéket ad vissza, ami az ugráshoz elég is lesz.

        if(Input.GetButtonDown("Jump"))
        {
            rb.AddForce(new Vector2(0.0f, jumpForce), ForceMode2D.Impulse);
        }

A fenti kódban több újdonság is történt.

Egyrészt most a "Jump" tengelyre kérdeztünk rá. Ez a Unity-ben alapértelmezetten az ugrás tengely, ami úgy van beállítva, hogy csak pozitív gombja van (a szóköz).

Másrészt nem hoztuk előre létre az ugrás irányát megadó vektort. Lehetett volna úgy is csinálni, mint a korábbi példában, de ez így egyszerűbb és rövidebb.

Harmadrészt az AddForce függvénynek megadtunk egy második paramétert is. Ezt meg kell szokni hogy a C#-ban a függvényeknek több paraméterlistájuk is lehet. Általában van egy bő paraméterlista, de ha nem adunk meg minden paramétert akkor azok alapértelmezett értékét teszi fel a függvény. Nekünk ez most azért nem volt jó, mert a Unity-ben az erők alapértelmezett formája a ForceMode2D.Force, ami egy másodpercre szétosztva adja át az ugrás erejét a karakternek. Az ugrás pedig tipikusan nem ilyen erő, egy hírtelen impulzusban kell átadni az ugrás erejét, amin a ForceMode2D.Force típusú erőhatás.

Végezetül, itt is meg kell említenem, hogy ahhoz hogy a karakterünk szépen ugráljon ahhoz még két dolgot be kell állítani.

  • Elég nagy erőt kell adni az ugráshoz, különben a játékos el sem emelkedik a talajtól. (Egy 8-10-es érték megteszi.)
  • Itt érdemes kipróbálni a játékot. Ha azt látjuk, hogy a karakter furcsa akrobata mutatványokat végez a levegőben, akkor pedig az Inspector-ban a RigidBody komponens Constraints csoportját kell kinyitni, és ott bepipálnia a Freeze Rotation Z paramétert.