Bejegyzés

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

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