1. A Unity fejlesztői környezet

Korábban már készítettünk pár játékot Scratch-ben és App Inventorban. Ezeknek az elkészítése viszonylag egyszerű feladat volt, mivel a játékok maguk is nagyon egyszerűek voltak, ennél fogva a játékélmény is csak korlátozott volt.

A népszerű, fizetős játékok fejlesztése ezzel szemben nagyon összetett feladat és sokféle ismeretet igényel, különösen, ha több platformon is (PC, mobil, konzol, web) szeretnénk elérhetővé tenni a játékunkat. A játékfejlesztő stúdiók hatalmas fejlesztői csapatokat tartanak fenn, és minden csapattagnak megvan a jól meghatározott saját feladata (alaptörténet megírása, látványvilág művészeti megtervezése, játékmenet kidolgozása, hang effektusok, szereplők 3D-s modelljének megalkotása, azok animálása, stb.). A munka összehangolásáért külön manageri csapat felel.

Persze kisebb játékok megvalósításába egyedül vagy kis csapattal is belefoghatunk, de számítsunk rá, hogy ha igényes eredményt szeretnénk elérni, az sok munkát fog igényelni. 

1.1. A játékmotor

Minden számítógépes játék (pár kivételtől eltekintve) megírásához és futtatásához úgynevezett játékmotort (game engine) használnak. E motor segíti a 3D-ben elhelyeztt objektumok és szereplők megjelenítését, animálását, a fizikai törvények (ütközés, gravitáció) figyelembe vétele mellett, illetve a hang-effektusok megszólaltatását, hálózatkezelést, játékvezérlők/kontrollerek használatát, stb. A legtöbb népszerű motor több platformra is elérhető, ez lehetővé teszi, hogy a játékot csak egyszer írjuk meg és a játékmotorra bízzuk a különböző platform-változatok elkész1tését. Több tucat játékmotor Az ismertebb játékmotorok között van az Unreal, CryEngine, A Valve által fejlesztett Source és a Unity.

 
img001 - 1.1 - 1.png

Mindegyik játékmotornak vannak előnyei és hátrányai. Ha 2D-s játékokat szeretnénk készíteni, akkor a GameMaker Studio 2 jó választás lehet, mert viszonylag egyszerű megtanulni és használni, illetve mert a legtöbb funkciója ingyenes. A Unity egy másik logikus választás lehet, mert ezzel 2D-s és 3D-s játékokat is tudunk fejleszteni, nagyon gazdag funkciókészlettel rendelkezik és szintén ingyenes. Az olyan bonyolult és drága játékmotorok, mint például az Unreal, semmiképpen sem ajánlott kezdőknek, ezeket a nagy játékfejlesztő stűdiók használják a legismertebb és legösszetettebb játékaikhoz.

Egy rövid áttekintése a legjobb ingyenes játékmotoroknak ebben a videóban látható.

Mi a Unity alapjaival fogunk megismerkedni a foglalkozásaink során. A Unity-ben készült játékok listája itt található.

1.2. A Unity környezet telepítése

A Unity játékmotor ingyenes Personal változatát a Unity weboldaláról tölthetjük le. A licenszfeltételek elfogadása után egy telepítőprogram töltődik le elsőként, amely majd letölti a teljes fejlesztőkörnyezetet. A telepítőprogram rákérdez, hogy a környezet mely komponenseit szeretnénk letölteni és telepíteni. Javasolt az alábbi ábrán szereplő komponensek kijelölése. 

Fontos: a telepítéshez legalább 20 GB tárhelyre lesz szükségünk és a kb. 9 GB-nyi adatot kell letöltenünk, ezért a telepítési folyamat hosszabb ideig is eltarthat. A Unity futtatásához erős gépre és legalább 8 GB RAM-ra van szükség. 

  

 
img001 - 1.2 - 1.png

A telepítés után rögtön el is indíthatjuk a Unity-t és elkezdhetünk dolgozni az első projektünkön. 

1.3. Ismerkedés a Unity felhasználói felületével

Amikor egy új projektbe kezdünk, akkor egy felugró ablakban meg kell adnunk, hogy mi legyen a neve, hová szeretnénk elmenteni és hogy 2D-s vagy 3D-s legyen-e. Ezen adtok megadása után megjelenik maga a fejlesztőkörnyezet ablaka. A mintaprojektünk neve legyen mondjuk LaneRunner.

 
img001 - 1.3 - 1.png

Az alkalmazás képernyőjének a közepén található a Scene nézet, ez lesz az az ablak, ahol a játék környezetét, objektumait és szereplőit fogjuk kezelni. A scene a játék egy szintjének, egy pályájának felel meg. Nevezzük át az alapértelmezett nevű pályát Level01-re.

A mi pályánk egyelőre üres (egy alapértelmezett fényforrást és kamerát leszámítva), mivel most kezdtük a projektünket. Adjunk tehát hozzá a pályánkhoz egy-két objektumot, mondjuk egy gömböt és egy kockát, a GameObject >> 3D Object menüpont alól. Ezek rögtön meg is jelennek a Scene nézetben.

A játékunkban jóformán minden GameObject, a játékaink ezen építőköckákbókl fognak állni. 

A Scene nézetben a következő módon navigálhatunk:

  • az egér görgőjével zoomolhatunk

  • lenyomva tartva a középső egérgombot a nézőpontot tolhatjuk el jobbra-balra és le-fel

  • lenyomva tartva a jobb egérgombot (vagy a bal egérgomb + Alt billentyűt) a nézőpontot elforgathatjuk az origónak megfelelő pont körül

  • egy objektumon kattintva majd F billentyűt nyomva ( vagy dupla-klikkelve az objektum nevén a Hierarchy nézetben) fókuszba hozza az adott objektumot a Scene nézetben.

Bal oldalt látható a Hierarchy nézet, itt találjuk a projektünkben létrehozott szinteket (scene-eket) és a hozzájuk adott objektumainkat, ideértve az alapértelmezett kamerát és fényforrást is, hierarchiába rendezve. Amikor ebben a nézetbe rákattintunk egy objektmra, akkor annak a tulajdonságai megjelennek a képernyő jobb oldalán található Inspector nézetben. 

 

Végül a képernyő alsó részében található a Project nézet, ahol a projekthez tartozó, beimportált, vagy az Asset Store-ban megvásárolt kellékeinket láthatjuk és kezelhetjük.

A nézetek elrendezését az alkalmazáson belül tetszőlegesen módosíthatjuk, átméretezhetjük, vagy el is rejthetjük azokat a nézeteket, amelyeket nem használunk. A saját elrendezéseinket elmenthetjük és később visszatölthetjük. Az alkalmazás pár előredefiniált nézetet bocsájt a felhasználó rendelkezésére, ezek közül a számunkra megfelelőt bármikor kiválaszthatjuk a jobb felső sarokban található legördülő listából.

A Game nézet úgy jeleníti meg a játékteret, ahogy azt a játékos a kameránkon keresztül látná. Érdemes kipróbálni egy olyan elrendezést, amelynél a Game és Scene nézetek egymás mellett vannak.

1.4. Objektumok használata Unity-ben

Jelenleg az objektumaink az üres térben "lógnak", minden rendes, természetes közegben játszódó játékban van talaj, amin közlekedhetünk. Az egyszerűség kedvéért legyen a játékunk talaja egy sík téglatest, amelyet a kockából készítünk. Ehhez először pozicionáljuk a kockát az origóba az Inspector nézet Transform komponenséből elérhető Reset funkcióval. Ennek hatására a test koordinátái lenullázódnak és a nagyitási faktor minden tengely mentén 1 lesz.

Ezután méretezzük át a kockánkat úgy, hogy egy lapos téglatestté váljon: ehhez az Inspector-ban a tengelyenkénti nagyítási faktorokat állítsuk (20, 1, 100)-ra.

(50, 35, -130)-as kamerapozíció és (10, -20, 0)-as kamerairány esetén az alábbiakat kell látnunk  a Scene és Game nézetekben:

 
img001 - 1.4 - 1.png
img001 - 1.4 - 1.png

Az Inspector-ban vagy a Hierarchy nézetben át is nevezhetjük a téglatestünket Ground-ra vagy Talajra.

 

Most adjunk a játékunkhoz egy újabb kockát, ő lesz a játékosunk, nevezzük is át őt Player-nek vagy Játékosnak. Az Y koordinátájának értékét állítsuk 1-re, hogy kiemelkedjen a talajból.

Egyelőre mind a talaj, mind a játékos egyszerű fehér, mert nincs anyag hozzárendelve ezekhez az objektumokhoz. A Project nézetben válasszuk ki az Assets elemet és a jobb klikkre előugró menüből válasszuk ki a Create >> Material pontot. A létrehozott anyagot nevezzük el, majd az Inspector-ban válasszunk ki egy nekünk tetsző színt. Ha létrejött az új anyag, akkor azt egyszerűen ráhúzhatjuk a Scene nézetben a kívánt objektumra. Az eredmény ilyen lehet:

​​

img001 - 1.4 - 2.png

A két objektum most ott marad, ahová raktuk őket, ha a talaj fölé emeljük a kockát, az a levegőben marad, nem esik le. Ez azért van, mert még nem írtuk számukra elő, hogy a fizikai törvények vonatkozniuk kell rájuk. Arra sincs lehetőségünk, hogy a játék alatt mozgathassuk vagy körbejárhassuk őket, mivel még semmilyen programozást nem végeztünk. Ahhoz, hogy a kockánk valódi tömör testként viselkedjen amire hat a gravitáció, hozzá kell adnunk egy Rigidbody komponenst az Inspector nézetben (Add Component >> Physics >> Rigidbody). A GameObject-ekhez különféle komponenseket addhatunk, ezek határozzák meg, hogy az objektumaink hogyan néznek ki és hogyan viselkednek.

A környezet felső részén középen található három nyomógomb (Play, Pause, Step), amelyekkel a játékot el tudjuk indítani, meg tudjuk állítani, illetve kockánként tovább tudjuk léptetni.

Ha a Play gombbal most elindítjuk a játékot, akkor a talajtól elemelt kocka valósághűen fog leesni és ütközni a talajjal, vagy, ahogy az alábbi példán látható, a többi objektummal. Ehhez a Rigidbody mellett a Box Collider komponsensre is szükség van. Ha azt letiltjuk, akkor az objektum akadálytalanul átsuhan a többin, anélkül hogy ütköznének.

Fontos: Play módban is végezhetünk módosításokat, de ezek elvesznek, amint kilépünk ebből a módból. Figeljünk tehát oda arra, hogy a megtartandó módosításokat sose végezzük Play módban.

​​

img006 - 1.4 - 3.png

A Mesh Filter komponens lehetővé teszi, hogy egy objektum alakzatát megváltoztassuk, például lecserélhetjük a kockát gömbre. De ahhoz, hogy gömbként is viselkedjen, a Box Collider komponenst is le kell cserélnünk egy Sphere Collider-re.

Megjegyzés: a Unity alapértelmezésként egy kék eget készít a környezetünkhöz, ezt lecserélhetjük a kamera tulajdonságainál egy egyszínű hátérre.

1.4.1. feladat

Kísérletezz többféle alakzat "leejtésével" és ütköztetésével. Keresd meg azt a kameraállást, ahonnan nézve az ütközések a leglátványosabbak.

 
 

1.4.2. feladat

Építs egy összetettebb játékpályát tekervényesebb talajjal, falakkal, oszlopokkal, akadályokkal. Használj különböző színű anyagokat.

1.5. Transform-ok és szerkesztésük

A Transform a GameObject egyik legfontosabb komponense, amely a GameObject 3D-s poziícióját (position), elfordulását (rotation), nagyítását (scale) és a szülő-gyerek állapotát (parenting) tartalmaza. Nincs GameObject Transform kompoens nélkül, mivel minden GameObject elfoglal a játéktérben valamilyen helyet, mégha nem is látható. A 3-dimenziós játéktérben az X, Y és Z tengelyeket a piros, zöld és kék színek jelölik. 

 
img016 - 1.5 - 2.png

 

A GameObject transform adatait megadhatjuk direkt módon a konkrét értékek (koordináták, elfordulás, nagyítás) megadásával az Inspector nézetben. Az X-Y-Z címkékre kattintva és az egeret jobbra-balra mozgatva folyamatosan is tudjuk változtatni ezeket az értékeket. 

A transform adatokat módosíthatjuk a Scene nézetben a GameObject manipulálásával is. Ehhez az eszköztárból elérhető Move, Rotate és Scale eszközöket használhatjuk (az eszközök elérhetőek a W, E és R billentyűk lenyomásával is).

img017 - 1.5 - 3.png

 

Ha egy GameObject-re kattintunk, az aktuális eszköznek megfelelő "gizmó" jelenik meg, amelyeket megfogva és egérrel húzva mozgathatjuk, elforgathatjuk vagy átméretezhetjük a kijelölt objektumot. Mozgatáskor ha a három kis négyzet valamelyikénél fogva "vonszoljuk" az objektumok, akkor annak a pozíciója a kijelölt síkban fix marad. Ha mozgatás vagy forgatás közben a Ctrl billentyűt lenyomva tartjuk, akkor az értékek változása nem folyamatos, hanem az Edit » Snap Settings pont alatt meghatározott egységenkénti lesz. 

Objektumok egymáshoz való illesztését a Vertex Snapping funkcióval valósíthatjuk meg, erről a funkcióról bővebben a Súgó Positioning GameObjects fejezetében olvashatunk.

A GameObject-eket hierarchiába (szülő-gyerek viszonyba) rendezhetjük a Hierarchy nézetben. Ilyenkor a gyerek együtt mozog, fordul és méreteződik a szülő objektummal. A hierarchia többszintű is lehet, egy szülőnek akárhány gyereke lehet (példa: test » végtagok). Ezzel a technikával egyszerűbb objektumokból összetetteket készíthetünk. Szülő-gyerek kapcsolat esetében a gyerek transform értékei nem abszolút értékek, hanem a szülőhöz viszonyítottak.

1.6. Terep és domborzat kialakítása

A játék mindig egy játéktérben zajlik. Ez lehet nagyon egyszerű, mint például egy játéktábla, de nagyon összetett is, mint például egy városi környezet sok-sok épülettel, vagy egy vadregényes dzsungel.. A környezt fogja megadni a játék alaphangulatát. Minél összetettebb a játékterünk, annál több dolga van a játékmotornak a megjelenítésével, ami a teljesítmény rovására mehet és alacsony FPS-t (frames-per-second) okozhat gyengébb eszközökön (az ideális érték kb 60 képkocka másodpercenként). A Unity minden objektumot síkokra bont (majd azokat pedig háromszögekre), hogy kiszámolhassa azok láthatóságát.. Minél több háromszög láthatóságát kell egyszerre megvizsgálni egy képkockában, annál alacsonyabb lesz a játék sebessége. Ezért kell alaposan meggondolnunk, hogy mennyire korlátozzuk le a játékteret és azon belül annak összetettségét. A Scene ablakban kiválaszthatjuk a drótváz (wireframe) nézetet, ebben jól látszik, hogy az objektumok hogyan vannak felbontva síkokra és háromszögekre. A Game nézetből elérhető Stats ablakban megnézhetjük a jelenükben szereplő háromszögek számát. Az alábbi jelenet például több mind 16 000 (!) háromszögre lett felbontva.

 
img018 - 1.6 - 1.png

 

A játék terepének kialakítása összetett feladat lehet, ezt Unity-ben egy beépített terepszerkesztő segíti. Egy üres Scene-ben hozzunk létre egy terepet a GameObject » 3D Object » Terrain menüből. A létrejött objektumnak a kötelező Transform mellett csak két komponense lesz: a Terrain és a Terrain Collider. A Terrain komponens Settings ablakában beállíthatjuk a terep szélességét, hosszát és magasságát, legyenek ezek például 200, 200 és 150. A Paint Height ablak Height mezőjében beállíthatjuk a terep talajának alapértelmezett magasságát, a példánkban ez lehet 20. A Raise/Lower Terrain, Paint Height és Smooth Height eszközökkel tetszésünk szerint alakíthatjuk ki a játékterünk domborzatát. Ezen eszközök használatát a Súgó Creating and Editing Terrains fejezete írja le.

1.6.1. feladat

Kísérletezz a terepszerkesztő eszközökkel, próbálj ki többféle ecsetet. Hozz létre egy összetett játékteret.

 

 

Önmagában az egyszínű domborzat nem valósághű, realisztikusabb látvány textúra használatával érthető el. A textúrák tulajdonképpen az objektum területére "felfestett" minkét irányban ismétlődő képek. Domborzat esetén ezek talajt, fűvet, homokot vagy egyéb felületet ábrázoló képek lehetnek, amiket például az Asset Store-ból szerezhetünk be. Pár beépített textúrát itt találhatunk: Standard Assets → Environment → TerrainAssets → Surface Textures.

Ha letöltöttük és importáltuk ezeket a textúrákat, akkor a Terrain komponens Paint Texture eszközével tudjuk megadni a domborzat textúráját. Az Opacity-nek köszönhetően ágymásra több áttetsző textúra is "festhető".

Ez a videó ad pár ötletet arra, hogy hogyan készítsünk saját domborzatot:

Az Asset Store-ból ingyenesen letölthető Standard Assets csomagban találhatunk Daylight Water and Nighttime Water prefab-okat, ezek segítségével igen látványos vízfelületet tudunk kialakítani. Az egyik kulcs tulajdonság a Water Mode, amelynek az értéke lehet egyszerű, tükröződő vagy áttetsző (Simple, Reflective, Refractive). Ha eléggé nagy méretet adunk meg a víz prefab-unknak, akkor akár tengerként is használhatjuk, ekkor a terepünk sziget lesz.

A terepünkön fákat is elhelyezhetünk a terrain Paint Tree eszközével. A fa típusa prefab asset formájában tölthető be egy csomagból. Az Asset Store-ból sokféle fa, akár ingyenes is, letölthető. Shift+egérkattintással törölhető egy fa a terepről.

1.6. További terrain elemek: fű, részletek, szél, ég

Valósághű aljnövényzetet a Paint Details eszközel tudunk a terepünkhöz hozzáadni. Igazából ez olyan textúra, amely teljesítményoptimizálási célok miatt mindig automatikusan a kamera felé fordul (billboarding), ezzel spórolva a háromszögek számán. A Unity LOD (Leve of Details) funkciója szintén a teljesítményt hivatott fokozni. Megadható pár paraméter, amely kvázi-véletlenszerűvé a növényzetet. A fű reagál a szélre, amelynek az intenzitását a terrain beállításainál adhatjuk meg.

Textúra helyett prefab-ot is használhatunk az apróbb nönényzet és tárgyak megadásához, ehhez az Add Detail Mesh opciót kell választanunk.

A fákra nem hat a terrain-nál megadott szél. Ha szeretnénk, hogy a fánk szélben mozogjon, akkor külön Wind Zone objektumot kell felvennünk a terepünkhöz.

Általában a játékkörnyezethez egy testre szabott égboltot is szeretnénk hozzáadni. Ez általában speciális anyagként van megvalósítva. Az Asset Store-ból több ingyenes égboltot (nappalit vagy éjszakait) is letölthetünk. A letöltött égbolt kiválasztását és beállítását a Window → Lighting → Settings menüpontból nyíló ablakban tehetjük meg.

1.7. Terep bejárása első személyű vezérléssel

Ha szeretnénk az elkészült terepünket bejárni a játékosunk szemszögéből nézve, akkor szükségünk lesz egy First Person Controller-re. Az FPSController prefab-ot a Standard Assets → Characters alatt találjuk, húzzuk azt a Scene nézetbe és a pozícióját kissé emeljük meg, hogy egy kevéssel a talaj felett lebegjen. Játék módba váltva a játékteret bejárhatjuk a játékosunkkal és a terepet az ő szemszögéből fogjuk látni. Az iránytáshoz a szabványos billentyűket használhtjuk, de ezeket felülbírálhatjuk az Edit → Project Settings → Input ablakban. A Slope Limit paraméterben megadhatjuk a maximálisan "megmászható" terepszöget, A Step Offset-ben pedig a megengedett maximális lépésmagasságot. További érdekes paraméterek lehetnek a következők:

  • Walk/Run Speed

  • Gravity Multiplier

  • Footstep Sounds