Belső tér illúziója és a Reflection Probe

Városi környezetben játszódó játéknál észrevehetjük, hogy az ablakon át be lehet nézni az épületekbe. Látszólag magától értetődő és egyszerű dologról van szó, de valójában alkalmazni kell egy kis trükköt ehhez az illúzióhoz.

A következő leírásban megismerhetjük ezt a trükköt, amely a Unity 5.x verziójától a legfrissebb verziókig használható.

Egy kis Reflection Probe bevezetés

Mielőtt elkezdjük, győződjünk meg róla, hogy a projekt beállításokban a Reflection Probes Box Projection opció be van kapcsolva. Ha nincs, akkor navigáljunk el az Edit/Project Settings/Graphics menübe, és szedjük ki a pipát a Use defaults opció elől, valamint kapcsoljuk be minden szinten a Reflection Probes Box Projection beállítást.

Projekt beállítása

A megvalósításhoz példaként egy házat fogunk használni, amelynek van kidolgozott belső tere, de bármilyen belsőteres modell alkalmas erre célra, valójában a koncepció a lényeg. Kezdésnek helyezzük el a modelljeinket.

A használt projekt és az assetei megtalálhatóak itt:
https://github.com/Anthelmed/unity-fake-interior-effect

Mielőtt folytatnánk, ellenőrizzük le, hogy a modellek statikusak-e. Kattintsunk a Static gombon a bal felső sarokban, miközben  a Hierarchy nézetben minden modell ki van jelölve.

Következő lépésként meg kell fordítanunk a belső térhez használt modellünket. De vajon miért? A valóságban a tükröződés (és a reflection probe is) megfordítja a képet, ezért mi még egyszer megfordítjuk, hogy ne egy tükörképet lássunk majd a belső térről.

Válasszuk ki a belső modellünket a Hierarchy nézetben, majd a Z tengelyen a Scale értékét állítsuk át -1-re.

Ahhoz, hogy a megértsük az egész műveletsor lényegét, meg kell ismerkedjünk a Reflection Probe-okkal. Ezek a kis gömbök valójában 360 fokban látó kamerák, melyeknél beállíthatjuk, milyen távolra is lássanak. A segítségükkel fogunk a belső térről egy 360 fokos felvételt készíteni, ez lesz a belső tér tükörképe.

Helyezzük el a probe-ot a Hierarchy/Light/Reflection Probe menün való kattintással, majd igazítsuk be a belső tér modellünk közepére.

Kapcsoljuk be a Box Projection opciót a Reflection Probe Inspector nézetében. Az átméretezés gombon való kattintás után húzzuk a sárga doboz széleit a lehető legközelebb a falakhoz, a plafonhoz és a padlóhoz.

Az Inspector funkcióban a mozgatás gombon való kattintás után húzzuk a probe-ot az ablakba.

Reflection Probe beigazítása

A fenti lépéseket ismételjük meg az összes ablaknál.

Belső terek vizuális javítása

Ha úgy ítéljük meg, hogy a belső terünk túl sötét, akkor többféle fényt is hozzáadhatunk.

A Hierarchy/Light menüből adjunk hozzá egy nekünk tetsző fényforrást. Ház esetében a leginkább valósághű fényforrás egy Area Light az ablaknál vagy egy Point Light lehet a csillár helyén.

Visszaverődések használata

Miután a reflection probe-ok és a fények is a helyükön vannak, akkor nincs más hátra, mint a fények belesütése (baking) a modellbe. Ez gépkímélő, mivel nem valós időben kell majd számolni, hanem előre elvégezzük a kalkulációkat.

Minden ablakhoz hozzunk létre egy quadot. Ezt a Hierarchy/3D Object/Quad menüvel tehetjük meg. Pozícionáljuk és méretezzük az objektumot úgy, hogy az teljesen takarja az ablakon való belátást.

Az ablaknak 100%-ban tükröződőnek kell lennie, ennek eléréséhez létre kell hoznunk egy új üveg materialt.

A Project/Create/Material menün való kattintás után állítsuk a Metallic és Smoothness paramétereket 1-re, így egy teljesen sima és tükröződő anyag jön létre. A materialt ezek után már csak rá kell dobnunk az ablakunkra.

A gyorsabb haladás érdekében egy szkriptet is készíthetünk, amely duplikálja a belső teres házban található modellben lévő reflection probe-ot az összes ablakhoz. A szkript maga nagyon egyszerű. A reflection probe-ot, mint paramétert átadjuk a szkriptnek, az másolatot készít róla, majd a helyére mozgatja azt.

Összefoglaló

A scene elindítása után már láthatjuk is az illúziót, ami már el tudja hitetni a játékossal, hogy valóban a ház belsejét szemléli. Sajnos ennek a módszernek is vannak hátrányai.

Reflection Probe végeredmény

Ugyan könnyen és gyorsan készíthetünk ilyen illúziót, de ha megfordítjuk az egyik ablakunkat, akkor a visszaverődés megtörik. Ennek az az oka, hogy a reflection probe által készített 360 fokos cubemap kép fix rotation tulajdonsággal rendelkezik. Ha módosítunk, akkor kézzel utána kell igazítanunk a probe-ot is.

Forrás: Medium.com

Skeldar

Talaj készítése Unity-ben (2. rész)

Az előző részben megismerkedhettünk a talaj generálásával, konfigurálásával és textúrázásával. De miért elégedjünk meg egy csupasz, dimbes-dombos, textúrázott felülettel? Ültessünk fákat! Ebben a részben a fák, fű és más objektumok elhelyezésével foglalkozunk.

Fák

Fákat a Place Tree eszközzel helyezhetünk el:

Place Tree

A Paint Texture eszközhöz hasonlóan, a Place Tree-nek is legalább talajhoz adott fára van szüksége, hogy használhassuk. Kattintsunk az Edit Trees… gombra, majd válasszuk ki az Add Tree opciót.

Add Tree

Az Add Tree párbeszédablak a következő paraméterekkel rendelkezik:

Tree: A fa modell, melyet a talaj falistájához adunk.
Bend Factor: A meghajlás mértéke. vagyis ha beállítunk szelet a talajhoz, akkor az mennyire legyen hatással a fűre.

Válasszuk ki a megfelelő ikont a Tree property mellett, és válasszuk ki a fát a megjelenő ablakból.

Select Tree

Kattintsunk az Add gombon, és adjuk hozzá a fát a listához:

Tree Inspector

A Place Trees eszköz paraméterei a következőek:

  • Trees: A fák listája, melyeket hozzárendeltünk a talajhoz.
  • Brush Size: Az ecsetünk mérete világegységben.
  • Tree Density: A festés során határozza meg a fák sűrűségét.
  • Color Variation: A véletlenszerű shade-elést állíthatjuk itt be.
  • Tree Height: A fák magasságát állíthatjuk be. A 100-as érték normál magasságú fákat fest, míg a 200 kétszereset, amennyiben a scale értéke 1.
    Fa magasságkülönbségek
  • Variation: A magasságnál alkalmazandó variációk.
  • Tree Width: Ugyanaz, mint a Tree Height esetében, de itt a szélességet adjuk meg.
  • Variation: A szélességnél alkalmazandó variácók.

Tömeges fatelepítés

A Unity-ben lehetőségünk van automatikusan helyezni el fákat talajon a Terrain/Mass Place Trees menüvel.

Tömeges fatelepítés

A menü kiválasztása után meg kell adjuk, hány fát szeretnénk elhelyezni. A Place gomb megnyomása után a Unity véletlenszerűen elkezdni lerakni a fákat. Ez a módszer minden fát kicserél, melyet előzőleg helyeztünk el.

Tömeges fatelepítés

A Unity csak a viszonylag sima talajon fog elhelyezni fákat.

Egyedi fák készítése

A Unity tartalmaz egy Tree Creator nevű eszközt, amellyel egyedi növényeket tudunk generálni. Új fa GameObject-et a GameObject/Create Other/Tree menüponttal tudunk létrehozni, melyet a főmenüből érhetünk el.

Tree Creator

A Tree Creator csomagot importálhatjuk is a Standard Assets-ből, amelyet a Unity készített. Ehhez ki kell választanunk az Assets/Import Package/Tree Creator menüt. A csomag hozzáférést biztosít néhány textúrához, amelyek jól használhatóak fák megalkotásához. A fenti kép a Big Tree assetet mutatja, amelyet a Tree Creator-ral hoztak létre.

A fák készítése egy mélyebb téma, amelybe érdemes beleásni magunkat, ha igazán szép erdőket akarunk készíteni. A Tree Creator használatáról részletesen lehet olvasni a Unity online dokumentációjában:
Unity dokumentáció

A talaj befüvesítéséhez a Paint Details eszközt használhatjuk az Inspector-ban.

Paint Details

A Paint Texture és a Place Trees eszközökhöz hasonlóan, a Paint Details esetében is definiálni kell először egy objektumot, amellyel a festést fogjuk végezni.

Kattintsunk az Edit Details… gombra, majd válasszuk ki az Add Grass Texture gombot a felugró menüben.

Add Grass Texture

Az Add Grass Texture párbeszédablak a következő paraméterekkel rendelkezik:

  • Detail Texture: A fűnek használt textúra.
  • Min Width: A fű szekció minimális szélessége világegységben.
  • Max Width: A fű szekció maximális szélessége világegységben.
  • Min Height: A fű szekció minimális magassága világegységben.
  • Max Height: A fű szekció maximális magassága világegységben.
  • Noise Spread: A fűgenerálásnál használt zaj mértéke. A kisebb szám kevesebb zajt jelent.
  • Healthy Color: Az egészséges fű színe a Noise Spread csomó közepén.
  • Dry Color: A száraz fű színe a Noise Spread szélein.
  • Billboard: Ha be van pipálva, akkor a fű mindig kamera felé fog fordulni.

Tetszett a cikk? Érdekel a játékfejlesztés? Jelentkezz iskolánkba!

 

Kattintsunk a Detail Texture tulajdonság melletti ikonon, és válasszuk ki a fű textúráját a megjelenő Select Texture2D párbeszédablakban.

Select Texture2D

A Standard Package-ben lévő Terrain Assets tartalmaz néhány fűtextúrát, amelyet a talajunk füvesítéséhez használhatunk. Adjuk hozzá a textúrát a talajhoz, és vessünk be egy területet.

Fű textúra részletek

 

Detail Mesh

A fűhöz hasonlóan, a Paint Details eszköz segítségével újabb elemeket adhatunk a talajhoz.

Paint Details

Egy detail mesh hozzáadásához kattintsunk az Edit Details… gombon az Inspector-ban, az előugró menüből pedig válasszuk ki az Add Detail Mesh opciót .

Add Detail Mesh

Az Add Detail Mesh párbeszédablak paraméterei:

  • Detail: A használni kívánt mesh.
  • Noise Spread: A részletek generálásához használt zaj mértéke. A kisebb szám kevesebb zajt jelent.
  • Random Width: A méretvariációk mennyiségi határa.
  • Random Height: A méretvariációk mennyiségi határa.
  • Healthy Color: Az egészséges részlet színe a Noise Spread csomó közepén.
  • Dry Color: A száraz részlet színe a Noise Spread szélein.
  • Render Mode: Grass lightning vagy normál Vertex lightning világítás között választhatunk. Például egy szikla esetén a Vertex beállítást érdemes használni. Minden olyan elemnél (pl.: bokor), amelyre hatással van a szél, érdemes Grass típusúra állítani.

A Terrain Assets nem tartalmaz semmilyen mesh-t, amellyel kidekorálhatjuk a talajt, de a Unity oldalán találunk számos bokrot és sziklát, amelyet használhatunk.

Adjunk néhány detail mesh-t a talajhoz:

Talaj Detail Mesh-ekkel

Ha módosítjuk a detail mesh-eket a Unity-n kívül, azok nem fognak automatikusan frissülni a talajon. A frissítéshez válasszuk ki a Terrain/Refresh Tree and Detail Prototypes menüt.

Talajbeállítások

Az utolsó gomb a Terrain Settings:

Talaj beállítások

A Terrain Settings három fő kategóriára bontható:

  • Base Terrain
  • Tree & Detail Objects
  • Wind Settings

Base Terrain

A Base Terrain a talaj rajzolatára van hatással.

  • Pixel Error: Ez a tulajdonság szabályozza a talaj geometriájának renderelésekor az elfogadható hibamennyiséget. A nagyon távol lévő részeknél kevesebb törésből fog állni a talajunk. Ahogyan a néző egyre jobban megközelíti ezeket a helyeket, a talaj úgy válik egyre finomabbá. Ez a renderoptimalizálás. A Pixel Error adja meg, mennyi hiba léphet fel, amkor a talaj messze van. A nagyobb érték jobb teljesítményt jelent ugyan, de kevésbé esztétikus.
    Pixel Error
  • Base Map Dist.: Az a távolság, ahol a textúra még nagy felbontásban látható, ezután már csak kis felbontásban lesz látható.
  • Cast Shadows: Ez az opció szabályozza, hogy vessen-e árnyékot a talaj vagy sem.

Tree & Detail Objects

A Tree & Detail Objects foglalkozik a fákra, fűre és detail mesh-ekre vonatkozó hatások beállításaival.

  • Draw: A fák, a fű és a detail mesh-ek renderelését tudjuk vele kapcsolni.
  • Detail Distance: Az a kamerától való távolság, ahonnan az említett elemek már nem renderelődnek. Nagyobb érték beállításával a távol lévő elemek is láthatóak maradnak, de ez nagyban tudja rontani a teljesítményt.
  • Tree Distance: Hasonlóan a Detail Distance-hoz, ez azt a távolságot adja meg, ahonnan a fák már nem lesznek renderelve. A nagyobb érték messzebbről is láthatóvá teszi a fákat.
  • Billboard Start: Az a távolság, ahonnan nem rendereljük a fákat, hanem azok Billboard-ként kerülnek megjelenítésre Mesh helyett.
  • Fade Length: Az a távolság delta, ahonnan a fák elkezdenek Billboard irányból Mesh irányba változni.
  • Max Mesh Trees: A mesh-ként ábrázolandó fák száma.

Wind Settings

A Wind Settings-ben szabályozhatjuk,  hogyan legyen szimulálva a szél a fákon, füvön és a talajon.

  • Speed: A füvön keresztülfújó szél sebessége. A 0-ás érték megállítja a szelet, de a fű néhány helyen ettől még dőltnek tűnhet.
  • Size: A fűvel borított terület nagysága, amelyre egyidőben hatással lehet a szél.
  • Bending: A szél által generált meghajlás mértékét szabályozó beállítás. A 0-ás érték megakadályozza, hogy a fű meghajoljon. Ha túl nagyra állítjuk ezt a számot, akkor a fű túlságosan meg fog hajolni, és ez nagyon természetellenes hatást fog előidézni.
  • Grass Tint: Ahogyan keresztülfúj a szél a füvön, adhatunk neki egy kis árnyalatot. A valóságban a fűszálak szöge megváltozik, ezért a színük is picit más, amíg hajlanak. A meghajlás valósághűbb lesz, de ehhez nagyon finoman kell beállítani ezt a színt, mert könnyen az ellenkező hatást fogjuk elérni.

Lightmapping

A jobb teljesítmény érdekében a talajt lightmappelhetjük, akárcsak a többi statikus objektumot a scene-ben. Ahhoz, hogy ezt megtehessük, a talajt Lightmap Static-ra kell állítanunk. Az alapbeállításban ennek a tulajdonságnak aktívnak kell lennie.

Összefoglaló

Számos funkcióval egyetemben, a Unity komoly terrain engine-nel rendelkezik, mellyel jól tudunk füvet, fákat és más objektumot is létrehozni, valamint elhelyezni. A sok funkció ellenére sajnos nagyon nehéz mindig pontosan úgy beállítani mindent, ahogyan szeretnénk, hogy kinézzen. A talaj azonban nagy jelentőséggel bír az összhatást illetően, ezért érdemes bőven rászánni az időt, hogy a játékunkban a talajt minél inkább az elképzeléseink szerint alakíthassuk ki. Ügyeljünk azonban arra, hogy ne legyen túl sok detail mesh, ahol a játékos is jár, mivel a collidereket ezekhez nekünk kell majd létrehozni.

Forrás: 3DGEP

Skeldar

Talaj készítése Unity-ben (1. rész)

Bevezetés

A leírás a Unity Terrain Engine-t mutatja be, melynek használata bizonyos szintű előképzettséget igényel, ezért aki csak most kezd bele a Unity-be, annak az alapokat bemutató írásokat javasoljuk az induláshoz.

A következő anyag megértéséhez fontos, hogy tisztában legyünk az alapfogalmakkal, projektekkel, az asset-kezeléssel és a GameObject-komponens modellel.

Talaj létrehozása

A scene-hez történő talaj létrehozásához kattintsunk a Terrain/Create Terrain menüponton, a főmenüben:

Talaj készítése

Ez a lépés egy új Terrain Asset-et ad a Project nézethez, továbbá egy GameObject is létrejön a scene-ben egy Terrain (Script) komponenssel, valamint egy Terrain Collider komponens, amely az új Terrain Asset-re fog mutatni.

Új talaj

 

Talaj felbontása

Amennyiben a jelenleg kiválasztott talaj beállításait szeretnénk módosítani, használjuk a Terrain/Set Resolution menüt a főmenüből:

Talaj felbontás

 

A Set Heightmap Resolution párbeszédablakban a következő jellemzőket láthatjuk:

  • Terrain Width: Megadhatjuk a talaj szélességét (X tengely) világegységben.
  • Terrain Height: Megadhatjuk a talaj maximális magasságát (Y tengely) világegységben.
  • Terrain Length: Megadhatjuk a talaj hosszát (Z tengely) világegységben.
  • Heightmap Resolution: A magasságtérkép felbontását állíthatjuk be. A magasságtérkép mindig egy négyzet alakú textúra. Ez az érték lesz a szélesség és hosszúság is, függetlenül a talaj alakjátol.
  • Detail Resolution: A részletességtérkép felbontása szabályozza a füvet és a háló sűrűségét. A legjobb teljesítmény érdekében ezt az értéket a lehető legalacsonyabban érdemes tartani, amely még hozza az elvárt részletességet.
  • Detail Resolution Per Patch: A részletes textúra e szerint a paraméter szerint szétbontásra kerül, és minden így keletkező darab egy geometriaként és egy textúraként tartalmaz minden részletet (fű és háló). Ha például a Detail Resolution 1024×1024 és a Detail Resolution Per Patch 8, akkor a darab felbontása 128×128 lesz. A nagyob paraméter kevesebb részletet jelent, így a GPU is kevessebbet számol, ha nagy a belátható terület. A kisebb értékek több rajzolást eredményeznek. A legoptimálisabb az, ha laposabb a terület, ekkor inkább nagyobb értéket (64-128) használjunk. Viszont ha hegyes-völgyes a táj, akkor kisebb beállításokkal (8-16) is operálhatunk.
  • Control Texture Resolution: A vezérlő textúra felbontása, melyet a talaj különböző textúráinak festéséhez használunk.
  • Base Texture Resolution: Alap textúra, melyet akkor használunk, ha a megfigyelő kellő távolságban van.

Talaj magasságtérképe

A magasságtérkép egy 2D-s textúra, amely a talaj magasságát kódolja. Az ábrázolás többnyire 8 vagy 16 biten történik, és az értkek 0 és 1 között találhatóak. A 0 a legalacsonyabb, míg az 1 a legmagasabb pontot jelöli.

Terrain 257x257

Magasságtérképet külső eszközzel, például Terragen-nel vagy az Asset Store-ban elérhető plugin-nel generálhatunk.

Terrain Toolbar

Az első három gomb a Terrain Toolbar-on a talaj magasságának módosítását teszi lehetővé:

  • Raise/Lower Height: Többféle ecset használatával állíthatjuk a magasságot.
  • Paint Height: Egy adott magasságra “festhetjük” a talajt.
  • Smooth Height: Ezzel az eszközzel finomíthatunk a talaj durva élein.

Raise/Lower Height

Ahogyan a neve is sugallja, ezzel az eszközzel növelhetjük vagy csökkenthetjük a magasságot. A talaj maximum magassága legfeljebb 1 lehet, és nem is állíthatunk be 0-nál kisebb értéket. A magasságérték mindig egy 0 és 1 közé eső tört.

Raise-Lower Height

A talajra való kattintással fokozatosan növelhetjük a magasságot. A Shift nyomva tartásával a magasságot ugyanígy csökkenthetjük. Az egérgomb folyamatos nyomva tartásával a csökkentést/növelést is folyamatossá tehetjük.

Raise-Lower Terrain Tool

A Raise/Lower Height ecset az alábbi paraméterekkel rendelkezik:

  • Brush Size: A csúszkával az ecset méretét állíthatjuk a magasságtérkép felbontási egységében. A minimum érték 1 magasság pixel, míg maximum értékként 100 magasság pixelt állíthatunk be.
  • Brush Opacity: Az ecset-átlátszóság határozza meg a változás intenzitását. A 0-ás értékkel nem fogunk előidézni változást, míg 100-ason a talaj a maximális növekménnyel fog változni.

Paint Height

A Paint Height segítségével lapos talajt készíthetünk úgy, hogy egy adott magasságot kezdünk el festeni. Síkságok és fennsíkok készítésére kiváló eszköz.

Paint Height Terrain Tool

A Paint Height ecset paraméterei a következők:

  • Brush Size: Az ecset sugarát állíthatjuk itt be a Raise/Lower Height-hez hasonlóan. A minimum és maximum értékek itt is 1 és 100 magasság pixelek.
  • Brush Opacity: Az ecset-átlátszóság határozza meg a változás intenzitását. A 0-ás értékkel nem fogunk előidézni változást, míg 100-ason a talaj itt is maximális mértékben fog változni.
  • Height: Az ecset lényege, itt adhatjuk meg, hogy milyen magasra fesse a talajt az eszköz. Ez az érték világegységben értendő. A minimum érték 0, a maximum a Terrain Height paraméter, amelyet a Terrain Heightmap Resolution-nél állítottunk be. Ezt az értéket kézzel is tudjuk állítani a csúszka segítségével, de ha a Shift-et nyomva tartva kattintunk egy ponton a talajon, akkor annak a magasságát is beállíthatjuk.

Smooth Height

Miután többször módosítottuk a talajt a Raise/Lower és a Paint Height eszközökkel, az elég darabossá tud válni. A Smooth Height az ilyen durva szerkezeteket simítja ki, így egy sokkal természetesebb talajt kapunk. Ez hasonló az erózióhoz, melyet több ezer év időjárási hatása okoz.

Az alábbi kép szemlélteti, milyen durva felületek tudnak létrejönni:

Talaj simítás előtt

Simítás után:

Talaj simítás után

A Smooth Height a következő paraméterekkel rendelkezik:

  • Brush Size: Az ecset sugarát állíthatjuk itt be a már ismert módon. A minimum és maximum értékek itt is 1 és 100 magasság pixelek.
  • Brush Opacity: Az ecset-átlátszóság határozza meg a változás intenzitását. A 0-ás értékkel nem fogunk előidézni változást, míg 100-ason a talaj a legnagyobb simítást kapja.

Magasságtérkép importálás/exportálás

A tökéletes magasságtérkép elkészülte után lehetőségünk van exportálni azt, hogy később egy másik projektünkben is használjuk vagy külső programmal finomítsunk még rajta. Külső programmal (pl.: Bryce, Terragen, vagy Photoshop) készült magasságtérképünket ugyanitt importálhatjuk is.

Az exportáláshoz kattintsunk a Terrain/Export Heightmap – Raw… menüponton a főmenüben:

Export Heightmap

Ezután az Export Heightmap párbeszédablaknak kell megjelennie:

Heightmap Export párbeszédablak

Az esetek többségében az alapbeállítások megfelelőek, ezért kattintsunk az Export gombon, ígyaz alkotásunk átkerül egy nyers fájlba.

Mivel nyers formában került exportálásra a magasságtérkép, nem tartalmazza a pixel formátumot vagy dimenziót, ezért ezeket ajánlott beleírni a fájlnévbe. Péládul egy 16 bites, 257×257 pixeles magasságtérképet valami hasonló néven javasolt elmenteni: terrain_257x257_16-bit.raw

Ezzel a módszerrel, ha külső programmal akarjuk használni ezt a fájlt, egyből láthatjuk, milyen is a benne lévő adat. Photoshop-ban például egy ilyen párbeszédablakban tudjuk beállítani, hogyan értelmezze a program a fájlunkat:

Photoshop nyers fájl opciók

Abban az esetben, ha helyesen adtuk meg az értékeket, a Photoshop-ban is ugyanazt kell lássuk mint Unity-ben:

Photoshop nyers fájl szerkesztés

A kívánt módosítások elvégzése után importálhatjuk is az új fájlt Unity-be. Kattintsunk a Terrain/Import Heightmap – RAW… menüponton, és megkezdhetjük az importálást.

Talaj textúrák

A textúrákat a Paint Texture eszközzel tudjuk rátenni a talajra:

Paint Texture

Mielőtt bármilyen textúrát rá tudnánk tenni a talajra, legalább egyet hozzá kell adnunk a talajhoz. A gyors haladás érdekében a Unity terrain asseteket is tartalmaz a Standard Package-ben. Az importáláshoz válasszuk ki az Assets/Import Package/Terrain Assets menüt:

Import Terrain Assets

 

 

Kattintsunk az Import gombon, így bekerülnek a textúrák a projektbe.

A Paint Texture eszközt kiválasztva kattintsunk az Edit Textures… gombon, és válasszuk ki az Add Texture opciót a felugró lehetőségek közül:

Textúra hozzáadása

Ezután az Add Terrain Texture párbeszédablaknak kell megjelennie:

Add Texture párbeszédablak

Az Add Terrain Texture párbeszédablakban a következő paraméterek találhatóak:

  • Splat: A textúra, amit alkalmazni kell.
  • Tile Size: A csempe mérete, melyre rá lesz húzva a textúra. Nagyobb csempeméret esetén kevesebb csempedarabból fog állni a talaj. Kisebb méret esetén a textúra többször fog ismétlődni.
  • Tile Offset: A paramétert állítva eltolhatjuk a textúrát. Ez akkor hasznos, ha több réteget szeretnénk összeolvasztani ugyanazzal a textúrával, hogy megtörjük az ismétlődést.

Kattintsunk a Splat paraméteren, és válasszuk ki az alkalmazandó textúrát:

Textúra kiválasztása

Az alkalmazás után a textúrának be kell borítania az egész talajt:

Textúrázott talaj

A Paint Texture eszköznek a következő paraméterei vannak:

  • Textures: Itt láthatjuk a talajhoz rendelt textúrákat. Maximum 255 textúrát adhatunk hozzá a talajhoz.
  • Brush Size: A Paint Brush sugara pixelben a Control Texture felbontásában.
  • Opacity: A textúra alkalmazásának intenzitása, melyet százalékban adhatunk meg.
  • Target Strength: Itt szabályozhatjuk az aktuálisan használt textúra alkalmazhatóságának limitjét. Ez egy arányszám a textúra és az alatta lévő textúra között. Ha nem szeretnénk több, mint 50%-os Opacity-t használni, akkor ezt 0.5-re kell állítanunk.

Mielőtt textúrákat mosnánk össze a talajon, legalább kettő textúrának kell lennie a listában. Adjunk hozzá néhány textúrát, és használjuk a Paint Texture eszközt talajunk kicsinosításához. Az aktuálisan használt textúra kékkel lesz bekeretezve az Inspector nézetben.

Textúrázott talaj

Tudomásunk szerint nincs opció arra, hogy magasság és lejtés szerint alkalmazzunk textúrákat, azonban valószínűleg erre létezik (fizetős) plugin.

A következő részben egy mérföldkőhöz érkezünk, mivel a talajunkra objektumokat is el fogunk helyezni. Kezdésképpen megtanuljuk, hogyan kell fát ültetni.

3DGEP

Skeldar

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

Textúrák, shader-ek és material-ok (2. rész)

Az előző részben megismerkedhettünk a textúrákkal és shader-ekkel, valamint a kapcsolódó munkamenetekkel. Megtudhattuk, hogy mire kell figyelnünk a textúrázásnál ahhoz, hogy elkerüljük a annak pontatlan illeszkedését. Kicsit elmélyedtünk a shader-ek világában is. A példákon keresztül bemutatva megérthettük azok funkcióit és tényleges hatásukat a modellekre.

A mostani részben az említett két alapelemből material-okat fogunk létrehozni, valamint bemutatjuk részletesen azok opcióit.

A material

A material tulajdonképpen csak egy tároló a shader-ünk és a textúránk számára. A modellekre közvetlenül a material-t tesszük, ezért például egy textúra soha sem fog direktben kapcsolódni egy modellhez, ahogyan azt talán elsőre gondolnánk.

A material konfigurációja legnagyobb részben az alkalmazott shader-től függ, de vannak olyan paraméterek is, amelyekkel shader-től függetlenül találkozni fogunk.

Új material létrehozása előtt javasolt készíteni egy Materials mappát. Jobb egérgombbal kattintsunk a Create/Material opción és adjuk meg az új material-unk nevét. Egy kevésbé komplex játék fejlesztése során is már sok material-lal fogunk dolgozni, ezért mindenképp informatív nevet válasszunk. Az alábbi képen két különböző shader-t használó material-t figyelhetünk meg. Észrevehetjük, hogy a Base Texture, Main Color, Tiling és az Offset paraméterek megtalálhatóak mindkét shader-nél, de a Shiny material azonban tükröződő felületek megjelenítésére kihegyezett shader-t használ, így ott ezen effekt beállítására találunk még néhány opciót. Az említett paramétereket a későbbiekben még részletesen bemutatjuk.

Shader beállítások

Shader-ek újratöltve

Most, hogy értjük a textúrák, shader-ek és modellek közötti összefüggéseket, ismerjük meg a normál shader-eket:

  • Diffuse: A Diffuse az alap material shader és egyben a legegyszerűbb is. A Diffuse shader-t használó modell felületén a fény egyenletesen oszlik el.
  • Specular: A Specular shader a modelleket fényessé teszi. Ha azt szeretnénk, hogy a modellünk sok fényt verjen vissza, ezt a shader-t alkalmazzuk.
  • Bumped: A Bumped shader-t általában más shader-rel együtt (pl. bumped-diffuse vagy bumped-specular) szokás használni. Ezek a shader-ek egy normal map-et használnak ahhoz, hogy a felület 3D-snek, göcsörtösnek vagy karcosnak tűnjön. Ennek a módszernek az óriási előnye az, hogy vizuálisan komplexebbnek tüntethetjük fel a modellünket anélkül, hogy a poligonszámot növelnénk.

Tetszett a cikk? Érdekel a játékfejlesztés? Jelentkezz iskolánkba!

Ha már kicsit jobban megismertük a beépített shader-eket, akkor ideje egy pillantást vetni a minden shader-nél fellelhető paraméterekre:

  • Main Color: A Main Color adja meg az objektum alapszínét. Ez nem változtatja meg magának az objektumnak a színét, ezzel az opcióval csak más árnyalatot adhatunk neki. Például, ha van egy modellünk kék textúrával és sárga main color-t állítunk be, akkor a modell nem fog sárgává változni, hanem zöld lesz. A Main Color opció csak egy másik színt kever az eredetihez, ezért lesz a kék és sárga kombinációjából zöld. Ha nem szeretnénk változtatni az eredeti textúrán, akkor ezt a paramétert állítsuk fehérre.
  • Specular Color: A Specular Color határozza meg a csillogás színét. Ezt érdemes fehérre állítani, hacsak nem szeretnénk, hogy a modellünk megvilágítás esetén más színnel csillogjon.
  • Shininess: A Shininess az objektum fényességének intenzitását állítja.
  • Texture: Itt adhatjuk meg az alkalmazandó textúrát.
  • Normal Map: A normal map képét állíthatjuk be ezzel a paraméterrel. Ez a kép ad göcsörtös megjelenést a modellünknek. Ez az opció igazán akkor hasznos, ha részletesebbnek akarjuk mutatni a megvilágított modellt, mint amilyen valójában.
  • Tiling: A Tiling adja meg, hogy a textúra milyen sűrűn ismétlődjön egy modellen. Külön állíthatjuk az ismétlődést az X és az Y tengelyen.
  • Offset: Az Offset szabályozza, hogy a modell élei és a textúra között mekkora rés legyen.

Egyszerű material létrehozása

Ha játszunk kicsit a paraméterekkel, gyorsan rá fogunk érezni, hogy a gyakorlatban mely opció mire is jó. Kis gyakorlás után ezek beállítása nagyon gördülékennyé tud válni.

Az alábbi módon készíthetünk egy nagyon egyszerű téglafalat:

  1. Indítsunk egy új projektet.
  2. Hozzunk létre egy Textures és egy Materials mappát.
  3. Keressünk egy téglafal textúrát az Interneten. Ügyeljünk rá, hogy a keresett kép ismételhető legyen, ezért a keresőben érdemes a tile kulcsszavat alkalmaznunk. A megtalált képet húzzuk az előző lépésben létrehozott Textures mappába.
  4. Adjunk egy Cube-ot a scene-hez. Pozícionáljuk a (0, 1, -5) koordinátákra. A Scale-t állítsuk (5, 2, 1)-re:
    Cube beállítások
  5. Hozzunk létre egy új material-t a Create/Material menüvel, majd nevezzük el például BrickWall-nak.
  6. A shader legyen az alapértelmezett Diffuse, de textúrának az előző lépésben kikeresett téglafal képét állítsuk be.
  7. Húzzuk a tégla material-t a cube-ra a scene nézetben.
  8. Figyeljük meg, hogyan teríti be a textúra a falat. A material Tiling paraméterével tudunk igazítani, ha esetleg nem lenne jó az elhelyezkedés.
  9. Adjunk Directional Light-ot a scene-hez a GameObject/Create Other/Directional Light menü segítségével. Állítsuk a pozíciót (0, 10, -10)-re és a Rotation-t pedig (30, 0 ,0)-ra.
    Téglafal

A végszó

Az előbbi műveletsor is megmutatta, hogy nem bonyolult dolog beállítani egy material-t. A nehézséget legtöbbször az adhatja, hogy megtaláljuk az ideális textúrát, shader-t, vagy normal map-et. Ha megvannak az elemek, a beállítások finomhangolása már a könnyebbik része lesz a munkánknak.

Forrás: Informit

Skeldar

Textúrák, shader-ek és material-ok (1. rész)

Egy játéktér a modellek sokaságából épül fel. Ezek a 2D-s vagy 3D-s objektumok a motorháztető alatt valójában több elemből épülnek fel. A játéktervező dolga beállítani ezen alkotóelemek paramétereit. A Unity egyszerű beállítási menete könnyen érthető és kezelhető, de ennek ellenére a grafikai megjelenést a végletekig testreszabhatjuk. Az objektumainkat ezen műveletsor mentén szétbontjuk alkotórészeikre, és mindegyikkel külön szekcióban foglalkozunk majd. Először talán furcsa is lesz, hogy a textúrát nem közvetlenül a modellre helyezzük, hanem a textúrák és a shader keverékéből készítünk el egy materialt, amelyet majd ráteszünk a modellünkre. Az efféle munkamenet előnye, hogy könnyen cserélhetővé válnak az alkotóelemek, így gyorsan és tisztán tudunk módosítani (akár futás közben) a paramétereken.

Munkamenet

Textúrák

A textúrák egyszerű 2D-s képek, amelyek “bőrként” vannak ráhúzva a modellekre. Nélkülük egy modell teljesen egyszínű, unalmas objektum lenne. Elsőre furcsa lehet egy 2D-s képet ráteríteni egy 3D-s modellre, de valójában elég egyszerű ez a folyamat. Vegyünk példának egy konzervet. A konzerv leszedett papírborítása tulajdonképpen olyan, mint egy textúra. Kinyomtatás után ráterítik a 3D-s konzervre, így az máris sokkal esztétikusabb látványt nyújt.

A Unity szerencsére nagyon megkönnyíti a projekthez való textúrák hozzáadását. Ha már adtunk hozzá más assetet, akkor a folyamat ismerős lesz számunkra. Érdemes egy mappát készíteni, melyet nevezzünk el például Textures-nek. Húzzuk bele a textúrának szánt képeket, és ezzel már készen is vagyunk.

A textúrák és konzervek kapcsán felmerülhet az a kérdés, hogy mi a helyzet a komplexebb objektumokkal? Ha összetett modellel kell dolgozzunk, akkor érdemes generálni egy unwrapet. Az unwrap nem más, mint egy térkép arról, hogy a majdani textúra hogyan fog rátapadni a felületre. A leírás ezzel a témakörrel részletesen nem foglalkozik, de az alábbi kép megtekintése után már sejthetjük, miről is van szó:

Unwrap

Előfordulhat, hogy egy textúra alkalmazása esetén az furcsán jelenik meg a felületen. Felhelyezés után elcsúszhatnak vagy akár el is fordulhatnak. Ez nem egy hiba. Ezt a jelenséget akkor tapasztalhatjuk, ha egy egyszerű, négyzetes textúrát akarunk rátenni a modellre. A modell nem tudja, melyik a helyes irány, ezért úgy alkalmazza, ahogy éppen esik. Elkerülhetjük ezt jelenséget, ha az adott modellhez (megfelelő unwrap szerkezettel) készült textúrát használunk. Ha grafikusokkal dolgozunk, akkor ők már eleve ennek megfelelően készítik el számunkra a 2D-s és 3D-s alapanyagokat.

Shaderek

A textúra meghatározza, mi legyen kirajzolva a felületre, míg a shader azt határozza meg, hogyan legyen mindez kirajzolva. A shader tulajdonképpen egy nagyon pici, GPU-n futó program, ami típustól és paraméterektől függően számolja ki, hogy milyen legyen a megjelenítés. A shader lehet kifejezetten vízfelülethez készült (részletesebben itt olvashatsz erről), vagy olyan, amely rajzfilmszerű megjelenítéshez passzol leginkább, de természetesen vannak általánosan használható shaderek is.

Előfordulhatnak olyan esetek is, hogy a már rendelkezésre álló shaderek számunra nem megfelelőek, mert esetleg valami nagyon egyedi és speciális megjelenítést akarunk adni a modellünknek. Ilyen esetben akár saját shadert is írhatunk, de ez már a játékfejlesztés egy komolyabb szintje, így ezzel a témakörrel ebben a leírásban nem foglalkozunk.

Egy material több paramétert és textúrát tartalmaz, a hozzá kapcsolt shader pedig alapvetően határozza meg, hogy a végén milyen felületet fogunk látni. Ez a valóságban nagyon egyszerű. Ha a materialokkal elkezdünk kísérletezni, egyből rá fogunk érezni, miről is van szó. Materialt nem is készíthetünk shader nélkül.

Egy kis gondolatkísérlet

Egyszerűen úgy érthetjük meg egy shader funkcióját, ha elképzelünk egy darab fát. A fizikai mivolta a fának a mesh. A színe és mintázata a textúra. Fogjuk meg a fát, és öntsünk rá vizet. Továbbra is ugyanabból az anyagból áll, de mégis máshogy néz ki. A fa kicsit sötétebb és fényesebb lett. A víz maga a shader. A shader az anyagot kicsit másmilyen kinézetűvé teszi anélkül, hogy változtatna rajta.

Az alábbi robot is remek példaként szolgál:

Shader példa

Az alkalmazott shader akár teljes egészében más hatásúvá teheti a materialt, így egy egyszerű shadercserével is tudunk új, különleges megjelenést létrehozni.

A továbbiakról

A leírás következő részében egybe fogjuk gyúrni a textúrákat és a shadereket, így új materialokat hozunk létre. Az egyik leggyakrabban látott illúziót is bemutatjuk, mégpedig azt, hogyan is tudunk egy valójában sima felületnek és textúrának göcsörtösséget, ezzel valósághűbb megjelenítést kölcsönözni.

Skeldar

Objektum mozgatás Unity-ben

Nem lenne játék a játék mozgó objektumok nélkül. Azt hihetnénk, hogy ez egy nagyon egyszerű dolog: csak arrébb kell tenni az adott objektumot minden képkockában. A gyakorlat egy kicsit más, több mozgatási módszer is létezik. Ez a leírás minimális programozási ismereteket feltételez, de a kezdők is el fognak tudni igazodni a szkriptekben.

Az alapok

Van egy objektumunk és egy 2D-s felületen, az X tengelyen szeretnénk jobbra/balra mozogni a nyíl gombokkal:

Objektum

    using UnityEngine;
    public class PlayerController : MonoBehaviour {
        Rigidbody rb;
        public float speed = 10.0f;
        void Start () {
            rb = GetComponent();
        }
      void Update () {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                rb.velocity = transform.right * speed;
            }
        }
    }

Így mozog, ha megnyomjuk a jobbra nyilat:

Jobbra mozgatás

Valami nincs rendben! Ha jobbra akarunk menni, miért indul el balra egy idő után a golyó? Ennek az az oka, hogy a golyó vektorai együtt forognak az objektummal. Egy idő után a golyó átfordul, és a jobbra irányszámunkra máris balt jelent.

Rögzíthetjük a golyót, hogy ne forogjon, ha befagyasztjuk a forgását:

    rb.freezeRotation = true;

Miután a sebességet 2.0f-re változtattuk, és a fenti sort hozzáadtuk, ilyesmi eredményt kapunk:

Jobbra mozgatás

Ez már jobban néz ki, de még mindig javíthatunk rajta.

Balra is szeretnénk menni, ehhez kicsit módosítani kell a kódon:

    using UnityEngine;
    public class PlayerController : MonoBehaviour {
        Rigidbody rb;
        public float speed = 2.0f;
        void Start () {
            rb = GetComponent();
            rb.freezeRotation = true;
        }
      void Update () {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                rb.velocity = transform.right * speed;
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                rb.velocity = -transform.right * speed;
            }
        }
    }

Mivel nincs transform.left funkció, ezért a transform.right funckiót kell tükrözni, azzal hogy elé teszünk egy mínusz jelet.

A módosítások után már tudunk jobbra és balra is mozogni a golyóval. Amennyiben további dimenziókat szeretnénk hozzáadni a mozgáshoz, akkor a Z tengelyen történő elmozdulást kell kezelnünk, hogy a talaj mentén tudjunk közlekedni.

Az előre történő mozgáshoz a következő sort kell használnunk:

    rb.velocity = new Vector3(0, 0, 1) * speed;

Ez azt eredményezi, mint a fenti példa, de egy 3D-s vektort hív ehhez segítségül.

A teljes kód:

    using UnityEngine;
    public class PlayerController : MonoBehaviour {
        Rigidbody rb;
        public float speed = 2.0f;
        void Start () {
            rb = GetComponent();
            rb.freezeRotation = true;
        }
      void Update () {
            if (Input.GetKey(KeyCode.RightArrow))
            {
                rb.velocity = transform.right * speed;
            }
            if (Input.GetKey(KeyCode.LeftArrow))
            {
                rb.velocity = -transform.right * speed;
            }
            if (Input.GetKey(KeyCode.UpArrow))
            {
                rb.velocity = new Vector3(0, 0, 1) * speed;
            }
            if (Input.GetKey(KeyCode.DownArrow))
            {
                rb.velocity = new Vector3(0, 0, -1) * speed;
            }
        }
    }

Mozgás minden irányban

A második módszer

Létezik alternatív megoldás is arra, hogy a golyót mozgassuk. Eddig a transform funkciókat használtuk, ami nem ad túl realisztikus mozgást. Az Input.GetAxis() használatával lehetőségünk van realisztikusabban mozgtani az objektumokat, mivel a nyers, “tedd odébb” parancsok helyett fizikai erővel hatunk az objektumokra, így idézve elő a mozgást.

    using UnityEngine;
    public class PlayerController : MonoBehaviour {
        Rigidbody rb;
        public float speed = 2.0f;
        void Start () {
            rb = GetComponent();
        }
      void Update () {
            float moveHorizontal = Input.GetAxis("Horizontal");
            float moveVertical = Input.GetAxis("Vertical");
            rb.AddForce(new Vector3(moveHorizontal, 0.0f, moveVertical) * speed);
        }
    }

Görgetés

A mozgatás RigidBody alapú, így ha módosítjuk a tömeget, a súrlódást, az hatással lesz a mozgatási képességre is.

A harmadik módszer

Egy másik lehetőség, hogy sebességet adunk a golyónak a fel/le nyilakkal, és forgatjuk a balra/jobbra nyilakkal:

    using UnityEngine;
    public class PlayerController : MonoBehaviour {
        public float movementSpeed = 5.0f;
        public float rotationSpeed = 200.0f;
        void Update () {
            transform.Rotate(0, Input.GetAxis("Horizontal") * Time.deltaTime * rotationSpeed, 0);
            transform.Translate(0, 0, Input.GetAxis("Vertical") * Time.deltaTime * movementSpeed);
        }
    }

Mozgó mosolygó labda

Két lehetséges megoldást kombináltunk, így kaptuk meg a harmadikat. A transform funciókat és a GetAxis()-t használtuk, amely kiszámíthatóbb mozgást tesz lehetővé, ezért ez jól használható például versenyzős játékok esetében.

A Unity-nek van egy beépített karaktervezérlője is, erre is érdemes egy pillantást vetnünk:

Karakter kontroller

A kód, amellyel WASD gombokkal tudunk mozogni:

    using UnityEngine;
    public class PlayerController : MonoBehaviour {
        CharacterController characterController;
        public float movementSpeed = 5.0f;
        private Vector3 moveDirection = Vector3.zero;
        void Start()
        {
            characterController = GetComponent();
        }
        void Update () {
            if (characterController.isGrounded)
            {
                moveDirection = new Vector3(Input.GetAxis("Horizontal"), 0.0f, Input.GetAxis("Vertical"));
                moveDirection = moveDirection * movementSpeed;
            }
            //Gravity
            moveDirection.y -= 10f * Time.deltaTime;
            characterController.Move(moveDirection * Time.deltaTime);
        }
    }

 

Ebben a megoldásban nem használjuk a RigidBody-t, így a gravitációt magunknak kell megírnunk.

Összegzés

A helyzettől függ, hogy melyik megoldást érdemes alkalmaznunk. Olyan esetben, amikor valaminek X idő alatt pontosan Y távolságot kell megtennie, kerüljük a fizikai erőkkel történő mozgatást, és inkább a transform paraméterek módosításával mozgassunk. A realisztikusabb mozgáshoz, amelyben a fizikát is alkalmazni akarjuk, az AddForce funcióval érdemes dolgoznunk.

Természetesen ezek nem kőbe vésett szabályok, lehetnek egy játékban olyan események is, amikor az AddForce alapú mozgatás a normál, míg bizonyos eseményeknél a velocity-vel kell operálni.

Forrás: Noob Programmer

Skeldar

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

Habár a repkedés önmagában is izgalmas lehet, még szórakoztatóbb, ha az űrhajónkkal lövöldözni is tudunk. A cél eléréséhez szükséges összes szkript megtalálható a példafájlokban, így túl sokat nem is kell majd hozzáadni.

Az ágyúk felszerelése

Válasszuk ki a Spaceship objektumot a Hierarchy nézetből, nyissuk meg az Assets/Scripts mappát, majd innen húzzuk az IonCannon szkript sort az Inspector-ba:

Ionágyú

Észrevehetjük, hogy egy Audio Source nevű komponens automatikusan hozzáadódott a GameObject-hez a szkripttel együtt. Néhány szkript nem fut önállóan, szüksége van más komponensekre is, melyeket a Unity automatikusan hozzáad, ha még nincsenek a GameObject-hez rendelve.

A lövési hang lejátszásához szükségünk lesz egy Audio Source-ra és egy Audio Clip-re. Az Audio Source bármilyen GameObject-hez csatlakoztatható, míg az Audio Clip csupán egy hangfájl.

Húzzuk a shoot hangot a Sounds mappából a Project ablakban lévő Fire Sound mezőbe:

Ágyú hangja

Az IonCannon szkript esetében láthatjuk, hogy az rendelkezik egy Bullet nevű mezővel. A következő feladatunk, hogy létrehozzuk a lövedék objektumot. Szerencsére nem kell ehhez művésznek lenni, ebben a példajátékban egy csilli-villi, animálódó plazmagömb helyett egy egyszerű gömb is megteszi.

Kattintsunk a Create gombra a Hierarchy nézetben. A 3D Oject/Sphere opciót válasszuk ki:

Lövedék hozzáadása

A Hierarchy nézetben a Sphere-t kiválasztva, majd Inspector-ra váltva, állítsuk a scale értéket 0.47-re. A gömböt ezután nevezzük el Bullet-nek.

Mivel a lövedék a scene-en belül fog mozogni, a fizikai motort is be kell izzítanunk. A Bullet-hez -a már ismert módon- adjunk hozzá a Physics/RigidBody komponenst az Add Component gombbal.

A lövedéknek lesz egy előre beállított sebessége, így az Is Kinematic opciót kapcsoljuk ki a Use Gravity-vel együtt.

A lövedék mozogni fog, miután elhagyta a képernyőt úgy, ahogyan az űrhajó tette ezt eredetileg. Ezt orvosolandó, húzzuk be a Bullet szkriptet a Project ablakból a Bullet GameObject-be. Ettől fogva a lövedék megsemmisül, ha kilép a képernyőről.

A Bullet objektumot már csak a Prefab mappába kell húzni. Így létrejön a Bullet Prefab, és szkript használatával lehetőségünk lesz sok-sok lövedéket létrehozni. Már lövedék Prefab-ként van jelen, így törölhetjük a Hierarchy-ban lévő példányt.

A Spaceship-et ismét válasszuk ki az Inspector-ban, és adjuk hozzá a Bullet Prefab-ot a Bullet mezőhöz. Az Inspector nézetnek hasonlóan kell kinéznie:

Ionágyú beállítása

Már csak az eget kell beállítani. Az űrhajónak egy üres, fekete térben kellene repkednie. Ehhez válasszuk ki a Main Camera-t a Hierarchy nézetből, majd az Inspector-ban a Clear Flags opciót állítsuk Solid Color-ra, a Background Color-t pedig feketére:

Kamera beállítása

Ezek után nem kell mást tenni, mint elmenteni a munkánkat, és kipróbálni az új ionágyút.

Ionágyú kipróbálása

Űrtörmelékek elhelyezése

Lövöldözni egy űrhajóval akkor igazán szórakoztató, ha van is mire lőni, ezért a következőkben aszteroidákat fogunk elhelyezni az űrben.

Keressük meg a rock_d_05.obj fájlt a példafájlok között, és húzzuk be a Models mappába a Project ablakban. Duplán kattintva nevezzük át a rock_d_05-ot Asteroid-ra:

Modellfájl átnevezése

Ez a fájl csak a modellről szolgáltat információt, nem tartalmaz semmilyen animációt.

Húzzuk az Asteroid-ot a Scene nézetbe, így létre is hozhatunk belőle egy példányt. Az így behúzott aszteroida egyszerű fehér színű:

Fehér aszteroida modell

Ugyan lehetne ez egy jégalapú üstökös maradványa is, de jobban fog kinézni, ha adunk hozzá valamilyen textúrát. Válasszuk ki az Asteroid GameObject leszármazott objektumát, a rockLP001-et. Az Inspector nézetben láthatjuk, hogy ez a GameObject-nek Mesh Renderer komponenssel is rendelkezik. A renderer rajzolja ki az objektumot, de ehhez némi segítségre van szüksége. Itt jön képbe a Materials opció.

A Materials határozza meg az objektum kinézetét. Például egy pamut anyagú egészen máshogy nézne ki, mint egy plasztik.

A Unity ezt shader-ek használatával éri el. De mi az a shader? A shader egy C-szerű nyelven íródott egyszerű program, amely a GPU-n fut. A shader elég egyszerű lehet ahhoz, hogy textúrát rendereljen egy kockán, de olyan komplex is, hogy vizet szimuláljon. A Unity nagyon sok beépített shader-t szolgáltat, például tud eget renderelni, de áttetszőnek is tud mutatni egy objektumot.

Nyissuk meg a Materials mappát a Project ablakban, és itt kattintsunk a Create gombra. A legördülő menüből válasszuk ki a Materials-t és nevezzük el Asteroid-nak. Az Inspector-ban így már látni fogjuk az egy anyaghoz tartozó tulajdonságokat.

Anyag beállítása

  • A Shader opció sok beépített lehetőség közül enged választani. Az alap Standard shader nagyon rugalmas beállítási lehetőséggel bír, így maradjunk annál.
  • Ha egy aszteroidát eltalálunk, akkor azt szeretnénk, hogy az eltűnjön. Ehhez a Rendering Mode-ot állítsuk Fade-re.
  • Az Albedo tulajdonság tartalmazza a textúrát. Húzzuk a flint_like_rock_4787 képet a Textures mappából a Albedo mezőbe:

Aszteroida anyagának beállítása

Az anyag azonban túl simának tűnik, mintha ki lenne fényesítve:

Polírozott aszteroida

A Metallic tulajdonság alatt két csúszkát találunk. Az első meghatározza az anyag fémes kinézetét, míg a második a textúra durvaságát hivatott mutatni.

Állítsuk be a Metallic csúszkát 0.219-re, a Smoothness-t pedig 0.149-re. Az anyagunk ezután ehhez hasonló képet kell fessen:

Fémes aszteroida

A anyagunk már be van állítva, ezután már csak hozzá kell adnunk az aszteroidánkhoz. Az Asteroid anyagot a Project ablakból húzzuk rá a Scene nézetben lévő Asteroid GameObject-re:

Anyagminta hozzáadása

A Debris szkript automatikusan hozzáad egy Sphere Collider-t, RigidBody-t és egy Audio Source-t az aszteroidához. Ha mindezzel megvagyunk, állítsuk be a paramétereket:

Asteroid GameObject beállításai

  1. A Sphere Collider közepét állítsuk 0.01, -0.09, 0.89 értékekre.
  2. A Radius-t állítsuk 1.49-re.
  3. Pipáljuk be az Is Trigger opciót.
  4. A RigidBody használatához pipáljuk ki a Use Gravity opciót.
  5. Pipáljuk be az Is Kinematic opciót.
  6. A Debris szkript esetében állítsuk a Min Speed-et 15-re és a Max Speed-et 30-ra.
  7. Húzzuk az explosion hangfájlt a Sounds mappából az Explosion Sound mezőhöz.
  8. A transform-nál az Asteroid GameObject minden Scale tulajdonságát állítsuk be 3.02-re.
  9. A Debris szkript hozzáadása egy Rendered Fade szkriptet is hozzáadott. Ha a lövedék eltalálja az aszteroidát, annak el kell halványulnia ahelyett, hogy egyszerűen eltűnne. A szkriptnek csak egy Fade Time tulajdonsága van, ezt tegyünk 0.5-ös értékre.

A lövedék mozgásterének beállítása

Ha az aszteroida kirepül a képernyőről, akkor az űrhajóhoz hasonlóan teleportálódnia kell. A Scripts mappából ehhez a ScreenWrap szkriptet rá kell húzzuk az Asteroid-ra. Az űrhajóhoz hasonlóan itt is be kell állítani a megfelelő renderert.

Az aszteroidának van egy gyereke, a rockLP001. Ezt húzzuk a Asteroid GameObject ScreenWrap Renderers tulajdonságára:

Aszteroida beállítása

Az Asteroid-ot már csak a Prefab mappába kell húznunk, ami a Project ablakban található. Ha ezzel készen vagyunk, akkor az aszteroida példányát töröljük a Hierarchy-ból.

Az aszteroidáknak már csak kiindulási helyre van szükségük. Kattintsunk a Create gombra a Hierarchy-ban, és válasszuk ki a Create Empty opciót. Nevezzük el a lerakási pontot Debris-nek.

Fontos, hogy a lerakási pont azonos szinten legyen az űrhajóval, különben a játékos az aszteroida felett vagy alatt fog röpködni. Használjuk referenciaként a missle_R_0 nevű GameObject-et, amely a modell közepén található.

Húzzuk a Debris GameObject-et úgy, hogy az a missle_R_0 gyereke legyen. A transform koordináták így innentől a szülő GameObject-hez fognak viszonyulni. Ahhoz, hogy megegyezzenek a koordináták, a Debris pozícióját állítsuk be (0, 0, 0) értékekre. Ezzel a kis trükkel az űrhajó és az aszteroida azonos síkban lesz.

Következő lépésként mozgassuk a Debris-t a Hierarchy nézet aljára, ahol eredetileg is volt:

Transform

Mozgassuk a Debris GameObject-et jobbra. Ha esetleg nem sikerül teljesen egyforma helyre húzni őket, akkor az új pozíciójukat (20.0, 1.72, 7.06) értékre kellene állítani:

Pozíció beállítása

Amikor összeáll a kép

Minden elem konfigurálva van, így már csak a kirakó összerakása van hátra.

Kattintsunk a Create-en a Hierarchy nézetben, és válasszuk ki a Create Empty opciót. Inspector nézetben kattintsunk az új GameObject-en és nevezzük el GameManager-nek.

Legyen a GameManager kiválasztva a Hierarchy nézetben, így kattintsunk az Add Component gombon, válasszuk ki a Scripts-et, majd a GameManager-t. Észre fogjuk venni, hogy ez a művelet egy Audio Source elemet is hozzáadott. A GameManager-nek van még számos más mezője, melyeket be kell állítanunk ahhoz, hogy az aszteroidák megfelelően jöjjenek létre a játékhoz.

Kezdjük a Debris mezővel. Ügyeljünk arra, hogy a GameManager kiválasztása aktív legyen, és húzzuk az Asteroid Prefab-ot a Debris mezőbe. Itt mit is csináltunk tulajdonképpen? A GameManager felelős az Asteroid objektum létrehozásáért. A Debris mezőt használja annak eldöntésére, hogy milyen objektumot hozzon létre a játéktérben. A fenti művelettel azt adtuk meg neki, hogy ez az objektum az Asteroid Prefab.

A GameManager-ben több időzítő érték is állítható. A Min Time-ot állítsuk 2-re, míg a Max Time-ot tegyük 5-re. A szkript ezekből a mezőkből tájékozódik arról, hogy milyen gyorsan jelenjenek meg az aszteroidák. A Total Items on Screen értéket 5-re állítva pedig azt mondhatjuk meg, hogy maximum 5 aszteroida lehet a képernyőn, ezzel megakadályozhatjuk, hogy a játékost elsöpörje az űrtörmelék. Ezután húzzuk a Debris GameObject-et a Hierarchy nézetből a Screen Debris mezőbe. Ezzel a művelettel mondjuk meg a GameManager-nek, hogy az aszteroidákat a Debris GameObject-en hozza létre.

A GameManager komponens ezután a következőképpen néz ki:

GameManager szkript

Végezetül, az Audio Source komponensben adjuk hozzá a background-music zenét az AudioClip mezőhöz. Ügyeljünk rá, hogy a Loop be legyen pipálva, így a háttérzene folyamatosan ismétlődve szól játék közben.

Háttérhang beállítása

Indítsuk el a játékot, és nézzük meg, hogyan is működik az alkotásunk:

Elkészült a játék!

Gratulálunk! Elkészült az első Unity-s játékod.

Ez a sorozat csak a felszínt kapargatta meg, mégis remélhetőleg jó rálátást biztosít arra, hogy egy (akár bonyolultabb) játék elkészítése során milyen lépéseket kell megtennünk, mikre kell odafigyelni. A tapasztalat növekedésével pedig minden játékot fejleszteni vágyó egészen biztosan késztetést fog érezni arra, hogy saját szkriptekkel, igazán egyedi működésű programot alkosson.

Forrás: https://www.raywenderlich.com/770-introduction-to-unity-getting-started-part-2-2

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