Unity-ben kettő teljesen különböző mód van a felhasználói inputok kezelésére. Egy régebb óta létező fapadosabb, de egyszerűbb verzió és egy újabb, ami jóval összetetteb, de jóval többre is képes, a New Input System.
Ezen kurzuson nem lesz időnk az újabb rendszert átvenni, ezt nem is javasolnám teljesen kezdő programozóknak. Eleinte bőven elég lesz nekünk a régi, amit sokkal könnyebb megérteni.
Ezt tárgyaljuk ebben a leckében.
Gombok lenyomásának lekérdezése
Előszöris le tudjuk kérni, hogy melyik gombot mikor nyomják le a billentyűzeten egéren vagy gamepad-en a következő módon.
GetkeyDown
Az Input.GetKeyDown()
lekérdezéssel mindig a lenyomás utáni első Update-ben lesz egyedül true a válasz. Tehát e módon pillanatszerű eseményeket tudunk lekezelni. Például, hogy mikor ugorjunk vagy mikor lőjünk.
void Update()
{
// Billentyűzet gombjainak lekérdezése:
bool jump = Input.GetKeyDown(KeyCode.Space); // Space gombot most nyomtuk-e le?
bool dash = Input.GetKeyDown(KeyCode.E); // E gombot most nyomtuk-e le?
bool reload = Input.GetKeyDown(KeyCode.R); // R gombot most nyomtuk-e le?
bool openMap = Input.GetKeyDown(KeyCode.Tab); // Tabulátor gombot most nyomtuk-e le?
// Egérgombokat kétféle módon is le lehet kezelni:
bool shoot1 = Input.GetKeyDown(KeyCode.Mouse0); // Bal egérgombot most nyomtuk-e le?
bool shoot2 = Input.GetMouseButton(0); // Pontosan ugyanaz, mint az előző sor.
// Az egérgombok esetén érdemes megjegyezni a megfelelő gombok indexét:
// 0 = bal egérgomb, 1 = jobb egérgomb, 2 = középső egérgomb
// 3-6 = egyéb egérgombok
// Gamepad gombok lekérdezése: (X-box controler szerint veszem a gombok nevét)
bool jump2 = Input.GetKeyDown(KeyCode.Joystick1Button0); // 1. gamepad A gomb...
bool dash2 = Input.GetKeyDown(KeyCode.Joystick1Button1); // 1. gamepad B gomb...
bool reload2 = Input.GetKeyDown(KeyCode.Joystick2Button2); // 2. gamepad X gomb...
bool openMap2 = Input.GetKeyDown(KeyCode.Joystick2Button3); // 2. gamepad Y gomb...
// Hogy melyik index mit jelöl annak érdemes a Unity dokumentációban utánanézni
}
GetKey
Ezzel szemben sok esetben arra vagyunk kíváncsiak, hogy mikor van lenyomva egy gomb. Ezt az Input.GetKey()
függvény adja vissza.
Ez kellene ahhoz például, hogy a mozgást irányát lekérdezzük.
void Update()
{
bool moveForward1 = Input.GetKey(KeyCode.W); // A W gomb épp le van-e nyomva?
bool moveBackward1 = Input.GetKey(KeyCode.S); // Az S gomb épp le van-e nyomva?
bool moveLeft1 = Input.GetKey(KeyCode.A); // Az A gomb épp le van-e nyomva?
bool moveRight1 = Input.GetKey(KeyCode.D); // A D gomb épp le van-e nyomva?
bool moveForward2 = Input.GetKey(KeyCode.UpArrow); // A ▲ kurzor gomb...
bool moveBackward2 = Input.GetKey(KeyCode.DownArrow); // A ▼ kurzor gomb...
bool moveLeft2 = Input.GetKey(KeyCode.LeftArrow); // A ◄ kurzor gomb...
bool moveRight2 = Input.GetKey(KeyCode.RightArrow); // A ► kurzor gomb...
}
GetKeyUp
Ugyanígy az is lekérdezhető, mikor engedünk fel egy gombot. Erre való az Input.GetKeyUp()
parancs.
A [SerializeField]
-hez hasonlóan ez is pillanatszerű: Csak a felengedés utáni első Update-ben lesz igaz az eredménye.
void Update()
{
// Billentyűzet gombjainak lekérdezése:
bool jump = Input.GetKeyUp(KeyCode.Space); // Space gombot most engedjük-e fel?
bool shoot = Input.GetKeyUp(KeyCode.Mouse0);// Bal egérgombot most engedjük-e fel?
}
[SerializeField] KeyCode
KeyCode
-ot [SerializeField]
osztályváltozóban is meg lehet adni. Ezáltal a game-dizájner számára beállíthatóvá tesszük, hogy melyik gombra történjen például az ugrás.
[SerializeField] KeyCode jump;
void Update()
{
bool doJump = Input.GetKeyDown(jump);
...
Tengelyek lekérdezése
A mozgáshoz szükségünk lesz egy 2D vektorra ami megmondja melyik irányba haladunk.
A külöböző iránygombok (WASD vagy kurzur gombok) lekérdezésével ezt a vektort össze tudjuk állítani.
Írjunk tehát egy függvényt, ami visszaad egy vektort aszerint, hogy milyen billentyűket nyomunk:
Vector2 GetMovementVector()
{
bool moveForward1 = Input.GetKeyDown(KeyCode.W); // A W gomb épp le van-e nyomva?
bool moveBackward1 = Input.GetKeyDown(KeyCode.S); // Az S gomb épp le van-e nyomva?
bool moveLeft1 = Input.GetKeyDown(KeyCode.A); // Az A gomb épp le van-e nyomva?
bool moveRight1 = Input.GetKeyDown(KeyCode.D); // A D gomb épp le van-e nyomva?
bool moveForward2 = Input.GetKeyDown(KeyCode.UpArrow); // A ▲ kurzor gomb...
bool moveBackward2 = Input.GetKeyDown(KeyCode.DownArrow); // A ▼ kurzor gomb...
bool moveLeft2 = Input.GetKeyDown(KeyCode.LeftArrow); // A ◄ kurzor gomb...
bool moveRight2 = Input.GetKeyDown(KeyCode.RightArrow); // A ► kurzor gomb...
float y = 0; // Függőleges irány
if(moveForward1 || moveForward2) // Ha a W vagy a ▲ gomb épp le van nyomva,
y += 1; // elmozgunk felfelé.
if(moveBackward1 || moveBackward2) // Ha az S vagy a ▼ gomb épp le van nyomva,
y -= 1; // elmozgunk lefelé.
float x = 0; // Vízszintes irány
if(moveRight1 || moveRight2) // Ha a D vagy a ► gomb épp le van nyomva,
x += 1; // elmozgunk jobbra.
if(moveLeft1 || moveLeft2) // Ha az A vagy a ◄ gomb épp le van nyomva,
x -= 1; // elmozgunk balra.
return new Vector2(x, y); // A mozgás vektor összeállítása és visszatérés vele.
}
Ennek az alternatívája, hogy manuálisan létrehozunk tengelyeket vagy Axis-okat a Felső menüsáv / Edit / Project Settings / Input Manager alatt.
Ha elnavigálunk ide, láthatjuk, hogy párat már a Unity létre is hozott alapértelmezetten. Pl.: Horizontal, Vertical.
A tengelyek mindig egy számot adnak meg -1 és 1 közt.
Ebben az esetben a lekérdezés kódja jóval egyszerűbb.
float x = Input.GetAxis("Horizontal"); // A vízszintes irányban elmozdulás mértéke
float y = Input.GetAxis("Vertical"); // A függőleges irányban elmozdulás mértéke
return new Vector2(x, y); // A mozgás vektor összeállítása
A Unity Axis-okat kicsikét unintuitiv módon arra is használhatjuk, hogy gomblenyomásokat kérdezzünk le. Ebben az eseben Input.GetButton()
Input.GetButtonDown()
és Input.GetButtonUp()
lekérdezéseket tudjuk használni és paraméterben az axis nevét kell megadnunk.
Input lekérdezésének ideje
Inputot általában Update
vagy LateUpdate
metódusban kérdezünk le. A későbbiekben azonban tanulni fogunk egyéb ciklikusan ismétlődő MonoBechaviour
üzenetmetódusokat. Ebben az esetben oda kell figyelni, mikor mit kérdezünk le, mert felelőtlen használat esetén hibás működés léphet fel.
Erről bővebben itt olvashatsz: A FixedUpdate és a gyorsuló mozgás - Inputkezelés és FixedUpdate