Saját endless runnerre vágysz? Mutatjuk, hogyan csináld!
Egy endless runner játék elkészítése egyszerűbb, mint gondolnád. Cikkünkből kiderül, miként érdemes hozzáfognod a fejlesztéshez.
Rendkívül népszerűek az mobilos gamerek körében a végtelenbe szaladást kínáló ügyességi játékok, és számítógépes környezetben is jó néhány, ebbe a kategóriába sorolható cím található, amely kiemelkedő letöltési mutatóval büszkélkedhet.
Mivel egy ilyen projekt viszonylag gyorsan megvalósítható, és csak minimális kódolás szükséges az elkészítéséhez, a Unityvel még csak ismerkedő felhasználók is bátran belevághatnak, garantált siker lesz a jutalmuk. Cikkünkben egy 2D-s platformer létrehozásán keresztül mutatjuk be, hogyan állíthatod össze és járhatod be karaktereddel saját, véletlenszerűen generálódó, soha véget nem érő pályádat.
Első lépések
A Unity HUB indítása után hozz létre egy új, 2D-s projektet, a felület betöltését követően pedig a jobb oldali Layout-gomb segítségével állítsd alapértelmezett (Default) elrendezésre a fejlesztői környezetet.
A játék elkészítéséhez használd a Unity korábbi beépített csomagjait, ez rengeteg felesleges kódolástól ment meg téged. Beszerzéséhez a szoftver elindítását követően kattints át az Asset Store fülre, és a keresőmezőbe gépeld be a Standard Assets kifejezést. Az első találatként megjelenő ingyenes csomagot válaszd ki, és klikkelj a Download-gombra. A letöltést követően elérhetővé válik a csomag, így már csak importálnod kell ahhoz, hogy élesíthesd.
Mivel a jelenlegi szoftver elkészítése során nem lesz szükséged minden komponensre, a felugró ablakban kiválaszthatod azokat az elemeket, amelyeket szeretnél használni. Ami ellenben nélkülözhetetlen, az a 2D-s csomag tartalma, de érdemes lehet még a Utilities és a CrossPlatformInput csomagokat is beemelned, ha később esetleg mobilra is szeretnéd optimalizálni a játékot.
Ismerkedés a robotoddal
Az importálást követően először keresd meg azokat az elemeket, amelyeket a játék elkészítése során használsz majd. Ehhez látogass el a frissen beemelt csomagban a 2D mappába, ahol a Prefabs könyvtár megnyitásával szemed elé tárulnak azok a komponensek, amelyek szoftvered építőelemeiként funkcionálhatnak. Játszható karaktered a CharacterRobotBoy névre hallgató kis robotfigura lesz, amely amellett, hogy számos azonnal bevethető animációt kínál, a jelenetbe helyezve a nyilakkal azonnal vezérelhető is.
Az Asset készítői ráadásul a felületére helyezett Rigidbody segítségével fizikával is felvértezték a kis robotot, valamint az ütközéseket detektáló Collidert is megkapta. Előbbinek köszönhetően, ha a munkafelületre helyezed a karaktert, akkor a gravitáció hatására azonnal zuhanni kezd, utóbbinak köszönhetően pedig képes lesz megállni a platformok felületén.
Pályaelemek előkészítése
A Standard Assets 2D-s csomagja számos, előre elkészített pályaelemet tartalmaz, amelyeket karaktered azonnal képes bejárni a képernyőre helyezést követően. Így tehát nincs más teendőd, mint a Hierarchy felületre behúznod a szimpatikus talajlapkákat, és az elindítást követően apró robotod már készen áll arra, hogy végigugráljon ezeken az elemeken. Ha nem ragaszkodsz a véletlenszerű generáláshoz és a végtelenbe tartó rohanáshoz, akkor itt akár egy olyan irányba is elindulhatsz, hogy kézzel felépíted az egyedi pályákat, amelyek végén a következő jelenetbe ugrik a karaktered.
Ha azonban célod a végtelen, akkor kattints a Project mappában található szimpatikus talajlapkára, és a jobb oldali, Inspector nézetben válaszd az Open Prefab feliratú gombot. Ezzel a szerkesztési nézetbe kerülsz, ahol módosításokat hajthatsz végre ezen a csomagon. Összesen két extra kiegészítőre lesz szükséged, egy Box Collider 2D-re, valamint egy üres GameObjectre.
Előbbi létrehozásához kattints a bal oldali Hierarchy nézetben a kiválasztott platformod nevére, majd a jobb oldali Inspector felületen válaszd az Add Component gombot, a keresőmezőbe gépeld be a Box Collider 2D kifejezést, és klikkelj a megjelenő elemre. A hozzáadott ütközőnek még a méretezésén kell változtatnod. Állítsd be úgy, hogy a platformod feletti részen a karaktered magasságával megegyező méretben fedje a területet, és ha ez sikerült, aktiváld az isTrigger opciója melletti jelölőnégyzetet is.
Ezzel sikeresen létrehoztad azt az elemet, amely érzékeli karaktered jelenlétét, és ez alapján lerakja majd a következő pályaelemet. Ezek után még egy üres GameObject hozzáadása szükséges. Ehhez használd a Hierarchy felület Create menüpontjának CreateEmpty opcióját. Az üres elemet a Move Tool segítségével mozgasd a platform végénél kicsit messzebb, de úgy, hogy még ugrótávon belül maradjon, ez lesz ugyanis a referenciapontod a következő talajelem elhelyezéséhez.
Kódolásra fel!
Elkészült a platform, és működik a karaktered mozgatása, így már rátérhetsz a kódolási részre, aminek köszönhetően elérheted, hogy a folyamatosan generálódó extra elemekkel egy végtelenbe tartó pályán találd magad. Ehhez hozz létre egy új szkriptet a Project felületen található Create-gomb segítségével, add neki a spawnTile nevet. Ezek után egy Notepad++ (notepad-plus-plus.org/downloads) segítségével nyisd meg a projektedben található, egyelőre üres kódot. Az Update metódust törölheted is, ez ugyanis szükségtelen a programodhoz.
A Start() előtt néhány változót létre kell hoznod. Elsőként a public GameObject[] tileList; sort gépeld be, amely a generálni kívánt padlókomponenseket tartalmazza majd. Kell még egy public GameObject spawnZone; sor is, ez pedig a létrehozott üres GameObjectre hivatkozik, továbbá egy BoxCollider2D bcol; is, amely deaktiválja az ütközést követően az érzékelőt (pluszként egy int one=0; változót is beemelhetsz az ellenőrzés miatt).
E sorok begépelését követően a Startban a bcol = GetComponent<BoxCollider2D>(); segítségével állítsd be a platformodhoz társított Collidert, így már a bcol változón keresztül a kódod segítségével hivatkozhatsz rá. Ha bővítetted vele a kódot, hozz létre a Start után egy új függvényt void OnTriggerEnter2D(Collider2D col){} néven, amely az ütközések vizsgálatát felügyeli majd. Belsejében állíts be egy feltételt, amelyben azt vizsgálod, hogy a one változód értéke megegyezik-e nullával.
Amennyiben ez teljesül, aktiváld a Instantiate(tileList[Random.Range(0, tileList.Length)], new Vector2(spawnZone.transform.position.x,spawnZone.transform.position.y+Random.Range(-4, 3)), Quaternion.identity); kódot. Ezzel az utasítás véletlenszerűen megjeleníti a spawnZone pozícióban az elemlistából szintén randomizáltan kiválasztott platformot, így már csak deaktiválnod kell az ütközés vizsgálatára kihegyezett Collidert a bcol.enabled=false; sor segítségével, majd megnövelned a one értékét (one++; ).
Ezek után a kész kódodat mentsd el és társítsd ahhoz a prefabs mappában található platformhoz, amelyiken használni szeretnéd (ha többet is bevetnél, akkor mindegyikhez add hozzá külön-külön). Már csupán annyit kell tenned, hogy a függvény változóira az Inspector nézetben ráhúzod a szükséges "idéző" komponenseket (érdemes az Open Prefabs gomb segítségével "megnyitnod" őket szerkesztésre).
A Tile List értéknél elsőként add meg a használni kívánt platformelemek számát, majd a megjelenő mezőkre húzd rá a különféle prefabokat, a Spawn Zone melletti mezőre pedig a bejárható objektumod mögé helyezett üres GameObject kerüljön. Ha ezzel elkészültél futtathatod a programot: a karaktered előtt sorban jelennek majd meg a járható pályaelemek.
Így fejleszd tovább!
Rengeteg irányba elindulhatsz a játék továbbfejlesztésével. A legegyszerűbb, ha újabb talajelemekkel bővíted az alkotásodat, ezeken akár ellenfelek és egyéb akadályok elhelyezése is lehetséges, így pedig még nagyobb kihívást jelent majd az előrehaladás. Ráadásként - hogy tényleg egy kis különlegességet csempéssz a készülő játékba - helyezz el egy szöveges grafikai elemet is a képernyőn, amely a kezdőponttól mért távolságot számlálja és folyamatosan megjeleníti.
Ezenfelül pár sornyi kóddal a spawnTile kódban elérheted azt is, hogy az egyes pályaelemek különféle színekben pompázzanak. Megkönnyítendő a fejlesztést, el is készítettük a szükséges scripteket az utóbbi kettőhöz, amit a PC World Plus Extrái között megtalálsz.