Bejegyzés

Valósághű víz készítése

A Unity egy modern, elsősorban játékok fejlesztésére szánt motor, amellyel konzolra, számítógépre, web-re és mobil eszközökre készíthetünk alkalmazásokat. A célplatformok képességei több nagyságrendbeli eltérést mutatnak, ezért egy multiplatform játéknak minden platform teljesítményéhez jól kell tudni alkalmazkodnia. Az egyik ilyen számításigényes játékelem, amelyet szépre, mégis gyorsra kell beállítanunk, az a víz.

Cél

Amellett, hogy meg tudja dolgoztatni a gépet, a játékoknál egyben kulcselem is, ezért nem lehet kihagyni sok stílusnál teljesítményhiány esetén sem. A következő leírásban a Unity beépített lehetőségeivel ismerkedünk meg, amelyekkel remek minőségű vizet tudunk majd létrehozni, feltéve, hogy az alapanyagaink jók. Sajnos nem minden tökéletes. A Unity 2018-as verzióiban a water shaderek nem teljesen jól optimalizáltak, ezért csak akkor használjuk őket, ha nem mobil eszközre, hanem komolyabb teljesítményű platformra kívánjuk elkészíteni a játékunkat.

A Unity-vel háromféle vizet tudunk létrehozni:

  • Water Basic
  • Water Pro
  • Water4

A Standard Package-ben megtaláljuk a prefabokat, shadereket, szkripteket és a többi assetet, amelyeket használni fogunk. A leírás ezek alkalmazására fókuszál, de természetesen bármikor használhatunk szebb, jobb textúrát…

A víz készítésének előfeltételei

Érdemes mindig a legújabb verzióval kísérletezni, hiszen sosem tudhatjuk, mikor javítottak éppen az általunk használt funkciókon.

A kezdéshez mindenképpen szükségünk lesz egy nagyon egyszerű talajra, ahol a kis tavunkat elkészíthetjük. Érdemes a medret és a világítást valósághűen kialakítani annak érdekében, hogy lássuk, miként fest a vizünk egy valódi mederben, milyen az átlátszóság és a tükröződés.

Water Basic

A kép alapján készítsünk egy hasonló medret, amelyet aztán feltöltünk vízzel. Az első módszer a vízfelület létrehozására a Water Basic prefab.

Meder

A Project fülön nyissuk meg az Assets-et, és tallózzuk ki az Environment mappát. Ebben két water mappát találunk: egy Water-t és egy Water (Basic)-et. Elsőként a Water (Basic)-kel fogunk dolgozni. Lépjünk bele, és nyissuk meg a Prefabs mappát. Ezen belül található a WaterBasicDaytime és a WaterBasicNightime.

Water prefab

Mielőtt továbblépnénk, ismerkedjünk meg kicsit a prefabokkal. A prefabok gameobject sablonok. Segítségükkel hozhatunk létre új, egységes objektumpéldányokat. Ez azért hasznos, mert ha valamennyi objektumunkat módosítani akarjuk, nem kell egyesével átszerkesztenünk őket, elég csak a prefabot módosítanunk, és az összes objektumunk azonnal változik. Természetesen ettől még nem veszik el az a lehetőségünk, hogy egy-egy példányt külön módosítsunk.

Nevéhez hűen a WaterBasicDaytime-ot akkor érdemes használnunk, ha a scene nappali, míg a WaterBasicNightime inkább éjszakai scene-ekben fog jól mutatni. Mindkettő ugyanúgy működik, de a második egy kicsit sötétebb színvilágú. A példában mi a nappali változatot fogjuk használni. Válasszuk ki a prefabot az egérrel, és húzzuk be a scene-be (többé-kevésbé próbáljuk belőni a medret). Ezzel a lépéssel hozzá is adtuk a WaterBasicDaytime-ot a terephez.

Ha esetleg nem sikerült jól az elhelyezés, utólag még javítsunk rajta a Position és Scale állításával.

Water Basic vízfelület

Ha a víz megfelelő helyen van, vessünk rá egy pillantást, hogy mit is tudunk vele innen kezdeni. Ha megvizsgáljuk Inspector-ban, észrevehetjük, hogy egy Water Basic Plane (Mesh Filter) és egy Water Basic szkript van rá beállítva, míg shadere a vízfelületekhez használandó Water (Basic).

WaterBasicDaytime beállításai

A Mesh Renderer-ben számos paramétert állíthatunk, többek között azt, hogy vessen-e árnyékot (Cast Shadows) vagy fogadjon-e árnyékot (Receive Shadows). A Cast Shadows és a Receive Shadows opciókat kapcsoljuk be a vizünkhöz. Ugyanitt a tükröződést is beállíthatjuk. A szebb (és kevésbé gépigényes) tükröződés érdekében használjunk reflection probe-okat a Blend Probes And Skybox beállítással.

Mesh Renderer

A WaterBasicDaytime shader segítségével is beállíthatunk több paramétert, mint például a Wave scale vagy a Wave speed. Lehet velük játszani, de egyelőre hagyjunk mindent alapbeállításon.

Water (Basic)

Az eredmény megtekintéséhez helyezzük a kamerát egy jó pozícióba. A legkönnyebben ezt úgy tudjuk megcsinálni, ha a Scene nézetben beállunk a kívánt helyre, majd kiválasztjuk a Main Camera gameobjectet. A GameObject menüben ezután már használhatjuk az Align With View opciót, így a kamerát a Scene nézethez igazíthatjuk.

Water Basic eredmény

Innen már vissza tudunk menni, és megváltoztathatjuk a prefab beállításokat, hogy lássuk, melyik hogyan módosítja a kinézetet. Játsszunk a Cast Shadows, Wave scale és a Wave speed opciókkal.

Water Pro

A következőkben részletesebben megismerkedünk a Water Pro-val, de előtte töröljük a WaterBasicDaytime gameobjectet a scene-ből, hogy tiszta lappal kezdhessünk.

Első lépésként a Project nézetben nyissuk meg a Standard Assets-et, ezen belül az Environment-et. Lépjünk bele a Water mappába. Itt két almappát fogunk találni: Water és Water4. A Water Pro használatához először a Water mappát, majd ez alatt a Prefabs-ot kell megnyitnunk.

Water Pro prefabs

A Water Basic-hez hasonlóan itt is két prefabunk van: WaterProDaytime és WaterProNightime. Mindkettő ugyanúgy működik, de ahogyan a nevükből is következik, a WaterProDaytime inkább a nappali scene-ekbe illeszkedik, míg a WaterProNightime a sötétebb scene-ekben fog jól mutatni.

Mivel nappali scene-ben dolgozunk, ezért a WaterProDaytime-ot válasszuk ki. Húzzuk be a prefabot a scene nézetbe. Itt is előfordulhat, hogy szükség lesz a Position és a Scale korrekciójára.

Ha elég nagy tavat hoztunk létre, egyből szemmel látható a minőségbeli különbség a Water Basic-hez képest.

Water Pro tó

Amennyiben a víz már a helyén van, vessünk egy pillantást arra, hogy milyen opciókkal dolgozhatunk. Az Inspector-ban számos komponenst láthatunk: Mesh-t, Mesh Renderer-t, Water (Script)-et és egy Shader-t.

WaterProDaytime beállítások

A Mesh Renderer-ben az előzőekhez hasonló paramétereket tudunk állítani. Itt is kapcsoljuk be a Cast Shadows és Receive Shadows opciókat. A Reflection Probes-ot tegyük Blend Probes And Skybox állásba.

A Water szkript további opciókat vonultat fel, melyeket be kell állítanunk. Ezek az opciók nem érhetőek el az előző víztípushoz.

Water szkript

A Water Mode-ot átállíthatjuk Simple-re, ekkor a víz a basic water-hez hasonlóan fog működni. A Relflective opció esetén a víznek lesz visszatükröződése, de fénytörése nem. A Refractive beállítással a tükröződést és a fénytörést is bekapcsoljuk. A Disable Pixel Lights paraméterrel csökkenthetjük a világítás minőségét, ezzel növelve az FPS-t.

A Texture Size a generált víz textúrájának felbontását jelenti. A Clip Plane Offset egy távolságérték, amely arra vonatkozik, hogy a visszatükröződött kép milyen mélyen jelenjen meg. A Reflect Layers és a Refract Layers ugyancsak hatással van erre a megjelenítésre. Ezek a rétegek szabályozzák, hogy mely scene objektumok legyenek láthatóak a vízben. Alapértelmezetten minden aktív.

A Shader komponensben tudjuk változtatni a Wave Scale-t, Reflection-t és a Refraction Distort-ot. Ezen beállítások módosítják a hullámok látszólagos méretét és a hatásukat a visszavert és megtört objektumokra. A Reflective Color a víz alatt lévő tárgyak árnyalatának beállítására szolgál.

Ha megnyomjuk a Play-t, akkor láthatjuk a Water Pro-t akció közben. Ez sokkal valósághűbb, mint a Basic verzió, de a számításigényessége miatt megfontoltan használjuk.

Water Pro eredmény

Water4

A Water4 teszteléséhez töröljük ki az előbb elkészített tavunkat.

A Project nézeten belül nyissuk meg a Standard Assets/Environment/Water/Water4 mappát. Itt a Prefabs mappán belül láthatunk egy Water4Simple és egy Water4Advanced elemet. Ha mindkettőt megnézzük, látszólag egyformának tűnnek. De akkor mi a különbség?

Water4 prefab-ok

A különbség a használt material milyenségében rejlik. A fejlettebb változat tartalmaz egy Shore és egy Foam textúrát. Ezek a textúrák kerülnek rá a hullámokra és minden olyan helyre, ahol más objektum megtöri a wave mesh-t, mint például a part.

Válasszuk ki a Water4Advanced prefab-ot és húzzuk be a scene nézetbe. Állítsuk be a Position és Scale paramétereket, amennyiben szükséges.

Water4 tó

Figyeljük meg, hogy a Unity automatikusan létrehoz egy reflection scene gameobjectet, ha hozzáadjuk a prefabot. Ez a gameobject segít abban, hogy módosítsuk a tükröződést. A kamera komponens a reflection gameobjecten lehetővé teszi, hogy a Water4 visszatükrözze a scene-t.

Water4 beállítások

Válasszuk ki a Water4Advanced gameobjectet. Az Inspector-ban számos tulajdonságot látunk, amelyekkel testreszabhatjuk a látványt.

Water4 beállítások

Az első csoport a Water Base (Script) komponens, amellyel meghatározhatjuk a víz material jellemzőit. Megadhatjuk a Water Quality opciót, amellyel a víz minőségi szintjét állíthatjuk három fokozatban. Az Edge Blend bekapcsolása esetén a Water4 elmossa a water mesh széleit.

A következő komponens a Specular Lightning. Ez a szkript szabályozza a víz tükröződési képességét. Ha jobban megfigyeljük, ez tartalmaz egy referenciát a specular gameobjecthez. Ezt a paramétert használhatjuk arra, hogy bármilyen fényforrásra hivatkozzunk. Ilyen lehet például egy directional light transform.

A Planar Reflection a valós idejű, sík tükröződéshez használható. A tükröződések a mesh magasságához képest lesznek kiszámolva, amelyhez majd a szkriptet hozzáadjuk. Számos paramétert beállíthatunk még, mint például reflection mask, skybox tükröződés, de akár egy tiszta tükröződési színt is választhatunk. Az alapbeállítások itt is megfelelőek, így ezeket nem szükséges módosítanunk.

Az utolsó, Gerstner Displace komponenssel a hullámgenerálást szabályozhatjuk.

Összefoglaló

Ezek voltak hát a Unity vízfelületei! Megismerhettük őket az alapoktól, így már csak a paraméterezéssel való játék maradt hátra, hogy a lehető legszebb tavat hozzuk létre. Az Assets Store-ban további vízzel kapcsolatos asseteket is felfedezhetünk, amelyekkel tovább csinosíthatjuk tengereinket, folyóinkat.

Forrás: Tuts+

Skeldar

Kezdők bevezetés a Unity-be (4. rész)

Az előző részekben megismerkedhettünk a környezettel, ahol a játékprogramozás zajlik, most viszont eljött az idő, hogy valóban elkészítsünk egy játékot. A gyakorlás céljából elkészítendő játék egy nagyon egyszerű, űrhajós-lövöldözős játék lesz. A játékkészítés során a következő dolgokat fogjuk elsajátítani:

  • Project ablak használata, asset-ek importálása és rendezgetése
  • Különbség a GameObject-ek és a Prefab-ok között
  • Unity fizika
  • Kamerák működése, a nézetek típusai
  • A Unity-ben lévő anyagok alapjai

A játék előre elkészített asset-ekből fog felépülni, de a későbbiekben a saját asset-ek készítésével és szkriptek írásával is megismerkedünk. Ha majd mindennel elkészültünk, akkor valami ilyesmi eredményt kapunk:

Game nézet

Kezdjünk neki

Töltsük le innen a sample-files fájlokat. Három mappát tartalmaz a példa: asset-ek, modellek és induló projekt. Az előző részekben megismert módon megnyithatjuk a projektet.

Megjegyzés: A Unity-ben a projektek megnyitása kicsit másabb, mint a többi programban. Kattinthatunk a scene fájlon, vagy kiválaszthatjuk a projekt mappáját is a Unity böngészőjében.

Open project

Open project

A fájlrendszerben keressük meg a game assets mappát, és válasszuk ki a benne lévő összes fájlt, vagy húzzuk őket az Assets mappába a Project ablakon belül:

Importálás

Megjegyzés: Ha esetleg nem látszódik a Project ablak, akkor válasszuk ki a Window\Layouts\2 by 3 opciót.

Ha a Unity végzett az importálással, akkor valami hasonló ablakot kell látnunk:

Asset mappa

A Unity alapértelmezetten nagy előnézeti képeket használ, de ezen változtathatunk az alul lévő csúszka segítségével . Ez jól jön, ha sok asset-tel kell dolgoznunk:

Asset ikon méretezés

Észrevehetjük, hogy az összes asset egy helyre van ömlesztve. A nagyobb projektek esetén elengedhetetlen, hogy jól szét legyenek válogatva a különböző elemek, mellyel nagyon sok időt megspórolhatunk a fejlesztés során. A lényeg az, hogy a játék tényleges fejlesztésére minél több idő maradjon, és ne keresgéléssel töltsük azt.

A Project ablakon belül a Create-re kattintva, és a Folder opciót kiválasztva új mappát hozhatunk létre.

Mappa létrehozása

Nevezzük el az új mappát Materials-nak:

Mappa átnevezése

Készítsük el még a következő mappákat is, amelyek az asset-einket fogják tárolni:

  • Models
  • Prefabs
  • Scripts
  • Sounds
  • Textures

A Unity-ben lévő mappák úgy működnek, mint a fájlrendszer mappái. A fájlrendszer követi a Unity-ben lévő rendszert, így a Unity-n kívül is ugyanazon a helyen fogunk megtalálni mindent. E működés miatt érdemes a Unity-ben, nem pedig fájlrendszerben rendezgetni .

Ideje rendezgetni! Válasszuk ki a Bullet, Debris, GameManager, IonCannon, RendererFade, ScreenWrap és a ShipController szkripteket és húzzuk őket a Script mappába.

A background-music, explosion és shoot hangokat húzzuk a Sound mappába.

Végezetül a flint_like_rock_4787 textúrát mozgassuk a Textures mappába. Ha mindezzel megvagyunk, akkor a Project ablakunk hasonlóképpen néz ki:

Asset rendezés

Még mielőtt nekiesnénk a munkának, fontos megszokni, hogy rendszeresen mentsünk, mivel a Unity nem tartalmaz automata mentési funkciót.

A Unity a munkákat scene-ekbe menti. A scene lehet egy szintje a játéknak, de akár az egész játék is lehet egy scene. Ebben a lövöldözős játékban az utóbbi fog megvalósulni: minden egy scene lesz.

Mentsük el a játékunkat. Nevezzük el a scene-t Main-nek. A Save Scene ablak így néz ki:

Scene mentése

GameObject-ekkel és Prefab-okkal való munka Unity-ben

Mit ér a játékprogramozás játékos nélkül? Nézzünk bele a models/player mappába. Itt FBX fájlokat fogunk találni néhány képpel egyetemben.

Az FBX fájl tartalmaz minden adatot, ami a 3D-s modell elkészítéséhez kell. Ilyen például az animáció. A játékos fájlt, melyet a leírásban használunk, ComboMash készítette a Hextraction játékához.

Válasszunk ki minden fájlt a player mappából, és húzzuk őket az Assets mappa tetejére, a Project ablakba. Ezután valami ilyesmit kell lássunk:

NormalMap settings

Néhány képformátum extra információt hordoz, habár szokványos formátumúak. A p_pod_normal.jpg például tartalmazza a felület mélységét, amely felszíni világításhoz nyújt információt anélkül, hogy bármilyen más geometriát kelljen ehhez létrehozni. Ezt normal map-nak nevezzük.

A Unity azonban azt hiheti, hogy normál képpel dolgozik. A Fix Now gombra kattintva beállíthatjuk, hogy a Unity ezt normal map fájlként kezelje.

Miután importáltuk a játékos fájlokat, húzzuk a hextraction_pod asset-et a Scene nézetbe az alábbi módon:

Ship hozzáadása a Scene-hez

El is készült a modell első példánya. A Unity helyesen importálta a textúrát és helyezte rá a modellre.

A Hierarchy nézetben pedig megjelent egy új GameObject:

Ship Hiererchy

Ahogyan az előző részekben olvasható volt, a Hierarchy nézetben minden elem egy adott típusú GameObject. A GameObject maga tartalmaz egy transform adatot, amely a pozíciót, méretet, forgási adatot foglalja magába:

Transform

A GameObject-et úgy tudjuk testreszabni, hogy Components-et adunk hozzá. A komponensek képviselik a GameObject viselkedését és megjelenítését.

A világítási komponens hozzáadásával például -nem meglepően- fénybe boríthatjuk a GameObject-et. Az Audio Source komponens segítségével a GameObject hangot bocsájthat ki. Saját komponenseket is írhatunk és adhatunk a GameObject-ekhez, ha nagyon egyedi dolgot szeretnénk.

A GameObject-ek tárolóként is funkcionálnak. Az Alt nyomva tartásával, a kis háromszögre kattintva a hextraction_pod-on kinyitjuk az objektumot:

Hierarchy fa

Legtöbbjük üres GameObject, amely a modell struktúráját képviseli. A Unity készíti el ezeket a GameObject-eket, amikor egy modellt importálunk. A többi GameObject, mint például a pod_mesh gyerekei, tartalmaz egy Skinned Mesh Renderers komponenst, amely egy geometriát jelenít meg a képernyőn.

Azt is észrevehetjük, hogy némely GameObject a Hierarchy nézetben feketén, némely pedig kéken van jelölve:

Ship Hiererchy

A fekete jelölés a normál GameObject-et jelöli, míg a kék azt mutatja, hogy a GameObject egy Prefab-bal a többi objektumhoz kapcsolódik. Amennyiben a GameObject barna színűre vált, az azt jelenti, hogy elvesztette a Prefabbal való kapcsolatot.

A Prefab lehetővé teszi, hogy úgy mentsük le a GameObject-eket, hogy azok  kódból vagy a Scene nézetbe való behúzással könnyen duplikálhatóak legyenek. Hasonlóak a sablonokhoz, azzal a különbséggel, hogy a Prefab-ok kapcsolódnak egymáshoz. Ha módosítjuka Prefab-ot, akkor minden példány módosul.

Ha van egy Prefab példányunk a Scene nézetben, akkor bárhogyan testreszabhatjuk. Lesz olyan, amikor a módosításokat a már létező Prefab-okon akarjuk elvégezni, és lesz olyan is, amikor mindent vissza akarunk állítani az eredeti állapotára, mert nem jöttek be a változtatások.

Válasszuk ki a hextraction_pod-ot a Hierarchy nézetben. Az Inspector ablakban három gombot láthatunk: Select-et, Revert-et és Open-t:

Prefab vezérlők

A Select lokalizálja a Prefab-ot a Project ablakon belül. Ez különösen hasznos, ha az elemet egy komplex mappastruktúrában nem a megfelelő helyre tettük le.

Ha változtatunk egy Prefab-on, akkor az Apply gombbal azonnal módosíthatjuk az összes példányt. A Revert gomb visszavonja az egy példányon eszközölt változtatásokat, visszaállítja az eredeti állapotot. Az Open pedig megnyit egy modell fájlt, amit valamilyen szerkesztőben készítettek (például Maya vagy Blender).

Jelenleg a játékos hajója alatt egy rácsozat van, ami furán néz ki. Válasszuk ki tile_reference GameObject-et a Hierarchy nézetből. Ez a közvetlen leszármazottja a hextraction_pod GameObject-nek.

Megjegyzés: A gyorskeresőbe beírva a GameObject nevét, villámgyorsan megtalálhatjuk az objektumunkat.

Prefab keresés

A tile_reference-et kiválasztva töröljük a rácsozatot. A Unity egy figyelmeztetést fog feldobni:

Unity figyelmeztetés

A Unity minden olyan esetben jelezni fog, amikor egy változtatás megtöri a Prefab-ok kapcsolatát. Mivel pontosan ezt akarjuk tenni, ezért kattintsunk arra, hogy Continue. A hextraction_pod feketére fog váltani, jelezve, hogy az elemből egy hagyományos GameObject lett:

Prefab

A hextraction_pod-on történő jobb kattintás után válasszuk ki a Rename opciót, és nevezzük át a GameObject-et Spaceship-re.

Húzzuk a Spaceship-et a Prefab mappába a Project ablakon belül:

Prefab létrehozása

Behúzva a GameObject-et a Project ablakba, az automatikusan átkonvertálódik Prefab-bá. Annyi űrhajót tehetünk így a játékba, amennyit csak szeretnénk, úgy, hogy csak behúzzuk őket a Scene nézetbe. Jelenleg ez csak lemásolja a modellt, de a későbbiekben tartalmaz majd szkripteket, hangokat és még sok mást is. Amint azt láthajtjuk, a Prefab-ok nagyon hasznosak:

Prefab duplikálás

Már csak egy kis időt kell szánnunk arra, hogy a Project ablak átlátható maradjon. Az Assets mappán való kattintással megjeleníthetjük annak tartalmát. Tegyük a hextraction_pod-ot a Models mappába, a p_pod_ fájlokat pedig a Textures mappába. Végezetül ne felejtsünk el menteni!

A továbbiakról

A játékprogramozás bemutatását szolgáló sorozat következő részében egy másik izgalmas elemmel, a kamera beállításával fogunk megismerkedni. Hiszen mit ér egy játék, ha nem látunk belőle semmit?

Skeldar