Képfájlok
A képfájljain, mint minden egyéb asset is az Assets mappában lesznek a projekt gyökerében. A Unity támogatja az összes gyakori kép fájlformátumot:
.PNG - Javasolt formátum. Tömörített, de nem veszteséges.
.BMP - Támogatott, de kevéssé javasolt. Tömörítetlen, túl sok helyet foglal.
.JPG - Támogatott, de kevéssé javasolt. Tömörített, de legtöbb esetben veszteségesen.
.PSD - A Photoshop natív formátuma. Használatához telepíteni kell a 2D PSD Importer packate-et a Package Manager-ben. Hasznos lehet, ha a photoshop része a használt workflow-nak. Használatával nincs szükség a képet exportálni más formátumba.
Egy képfájlt több mindenre is lehet használni Unity-ben és függően attól, mire használod más és más beállítások fognak a fájlhoz tartozni. A két legfontosabb használati mód a Textúra a 3D grafikában és a Sprite a 2D grafikában.
Sprite és Spritesheet
2D grafikában pixelgrafikus képeket jelenítünk meg egymás mellett és halmozva rétegekben. Ebből áll össze a játékvilág. Ezeket a képeket sprite-oknak nevezzük.
A sprite és a kép fogalma abban tér el, hogy a sprite szó magában hordozza, mire használjuk a képet:
A sprite-ok különbontható eleme egy nagyobb 2D kompozíciónak.
Egy sprite-ot sok mindenre használhatunk. Megjeleníthet környezeti elemet, gyűjthető jutalmat, ellenfelet és a játékos karaktert is.
Ahhoz, hogy egy képfájl sprite-ként viselkedjen, be kell állítani ezt a hozzá tartozó metafájlon: Projekt ablak / Kattintás az asset fájlra / Inspector ablak / Texture type: Sprite (2D and UI)
Itt sok egyéb információ is beállítható egy képfájlhoz.
Alapvetően 2 módon tárolhatunk sprite-okat: fájlonként külön-külön vagy többet egy fájlba összevonva. Az utóbbi esetben nevezzük a gyűjtő fájlt spritesheet-nek.
A két módszer közt igazából nagy különbség a játékmotor szempontjából nincs. Ha valaki sprite-okat gyárt egy játékhoz, azt javaslom, hogy aszerint döntsön arról, hogy külön fájlokban vagy spritesheet-en tárolja a képeit, hogy az elkészítés, exportálás és utólagos manipulálás hogyan egyszerűbb. Ez a fejlesztő munkamentétől függ csak,ó.
Ha több sprite-ot is tartalmaz a fájl, akkor a Sprite Mode beállítást Multiple-re kell állítani.
Sok módja van annak hogyan használhatunk ki egy spritesheet-et:
- Egy objektum több verzióját tarthatjuk egy spritesheet-en, például animációinak különböző állapotait.
- Egy több sprite-ból is álló objektum különböző részeit:
- Bármi egyéb módon összekapcsolódó sprtie-okat.
Ha egy fájlban egy sprite-ot tárolunk, akkor a Single vagy Polygon lehetőség közül dönthetünk.
Körbevágás
A sprite-ok háttere általában átlátszó, hogy egy nagyobb jelenetbe ágyazva és mozgás közben is jól működjenek. Emiatt általában lehet optimalizálni a megjelenítésen azzal, ha nem a teljes téglalap alapú képfájlt rajzoljuk ki hanem egy körülvágott sokszöget, ami tartalmazza az összes látható pixelt.
A sokszög pontjainak száma és a befoglalt pixelek is mind enyhén lassítják a kirajzolást, emiatt az ideális egy arany középút megtalálása. Ezt jobb a Unity-re bízni, de magunk is definiálhatjuk a sokszöget. Utóbbi esetben a Sprite Mode Polygon beállítását kell választani.
(A Unity nem kommunikálja ezt tisztán, de amennyire én látom a Polygon mód már egy elavult beállítás mivel a Single módban is definiálható már a kirajzolt alakzat manuálisan is.)
Single és Multiple esetén két fajta módon történhet a körbevágás és ezt a MeshType beállítás szabályozza.
- Tight: Automatikusan körbevágott.
- FullRect: Egyáltalán nem vágjuk körbe. A teljes téglalapot megjelenítjük. Ez nem optimális, de van olyan szituáció, amikor javasolt.
Egyéb sprite beállítások
- Pixel per Unit
- Pivot
- Generate Physical Shape
- Advenced
Ezáltal adható meg, hogy (egyéb méretezés nélkül) a képfájl egy pixele mekkora területet foglaljon el a virtuális térben.
Másként megfogalmazva: Egy egységnyi hossz a játékban, hány pixel hosszú lesz.
Ez játékonként és assetenként is változhat.
Mint mindent a Unity-ben Sprite-ok megjelenítését is GameObject-ek fogják végezni. Egy GameObject-nek csak egy pontszerű pozíciója van. Ezzel szemben egy sprite kiterjedt a 2D síkon. A pivot azt határozza meg, hogy a kép melyik pontja kerüljön a GameObject pontos pozíciójába.
A játékokban a megjelenített kép vagy 3D modell általában nem egyezik meg a fizikai alakkal, ami interakcióba tud lépni más fizikai alakokkal.
Fizikai alakot adhatunk egy képnek, ha ezt nem tesszük meg, a Unity generálhat egyet automatikusan.
Ahogy a név is mutatja ezek haladó beállítások. Itt nem tárgyaljuk őket.
NEM Sprite Specifikus kép beállítások:
- WrapMode
- Filter Mode
- Platform specifikus beállítások
Ennek jellemzően 3D grafikában van jelentősége, amikor textúraként használjuk a képet. Bővebben: 3D képalkotás
Egy sprite-ot szinte sosem jelenítünk meg a kijelzőn pontosan annyi pixelen, mint amennyit a képetfájl tartalmaz. Emiatt valami algoritmus alapján át kell alakítani a képet kisebbre vagy nagyobbra. Ennek módját a Filter Mód határozza meg.
A Point vagy más néven “legközelebbi szomszéd” algoritmus a leggyorsabb, ez meg fogja tartani a kép pixeles jellegét. Ez pixel art esetén lehet hasznos.
A Bilinear és Trilinear algoritmus kisimítja a képet. Ez általában “jobb” eredményt eredményt ad, ha nem pixelarttal dolgozunk.
Kettő közti különbségekkel itt nem foglalkozunk.
A mellékelt ábra jobb oldala Point skálázást használ, a bal oldala Bilinear-t.
A platform specifikus beállítások, tárhely optimalizáció szempontjából hasznosak. Célplatformonként külön állíthatók és eltérő beállításokat tartalmazhatnak.
Sprite Editor
Sprite és spritesheet szerkesztésére a Sprite Editor-ban van lehetőség, ami egy kép Asset-fájl Inspector felületén elérhető. A Sprite Editor eléréséhez telepíteni kell a 2D Sprites nevű csomagot:
(Felső menüsáv / Window / Package Manager / Packages:Unity Registry / 2D Sprites / Install)
Itt beállítható több dolog a sprite-okhoz és spritesheet-ekhez.
- A spritesheet egyes sprite-jai és azok határaik. A feldarabolásra több automatizált megoldás is létezik.
- Az egyes sprite-ok pivot pontja.
- Kép keretei: Borders. Ezáltal 9 részre bonthatjuk a képet, hogy ez mire használható, arról a következőfejezetben lesz szó.
- Fizikai és a megjelenítéshez használt polygon szerkesztése.
- Egyéb másodlagos textúrák hozzárendelése egy sprite-hoz. Pl.: Normálmap.
Ennek kihasználásához speciális Material kell. Lásd később: 3D képalkotás
SpriteRenderer
Ahhoz, hogy egy Sprite-ot megjeleníthessünk Unity-ben szükségünk van egy GameObject-re és rajta egy SpriteRenderer komponensre. Ennek beállításait itt tekintjük át:
- Sprite
- Color
- Flip
- DrawMode
- Sliced: A köztes részeket szétnyújtja a Unity kirajzolásnál:
- Tiled: A köztes részeket csempe szerűen ismétli a Unity kirajzolásnál:
- Mask Interpolation
- Material
A SpriteRenderer-nek szüksége van egy Sprite-ra, amit megjelenít. Ezt a be kell kötni a komponensnek manuálisan.
Egy friss Unity projekt (pár UI elemen kívül) nem tartalmaz sprite-okat. Ezeket kívülről kell beimportálni a játékba. Ehhez használhatod az ingyenes Asset pakkunkat: Ingyenes Asset-ek
Csak azt a képfájlt tudjuk felhasználni Spriteként, ami TextureType beállítása Sprite.
Ezzel a színnel lehet “szorozni” a képet! Szín szorzása azt jelenti, hogy minden színcsatorna (vörös, zöld, kék és alfa) 0-tól 1-g terjedő értékét szorozza minden pixelre.
Figyelem! Ha a szorzó szín alfa értéke nullán áll a sprite teljesen átlátszó, tehát láthatatlan lesz!
Itt lehet a Sprite-ot megtükrözni X és Y koordináta mentén.
3 féle kirajzolást támogat a Unity. Ebből a legegyszerűbb a Simple. Ez egyszerűen csak kirajzolja a sprite tartalmát.
A másik kettőhöz szükségünk van egy extra beállításra a sprite fájlon, amit a Sprite Editor-ban lehet megtenni. Itt a sprite felbontható 9 részre: A kép 4 sarkára, a tetejére és aljára, bal és jobb oldalára, és a közepére.
Slice és Tiled módban a 9 részre vágott kép tetszőlegesen méretezhető.
Lehetőség van maszkolni egymással 2 Sprite-ot. Ehhez egy másik GameObjekten kell lennie egy SpreiteMask komponensnek.
Egyéb Material-t is rendelhetünk sprite-hoz, ami annak megjelenítését egyedivé tudja tenni. Pl.: Normálmapot használó material.
Material-okkal bővebben itt foglalkozunk: 3D képalkotás
Kirajzolási sorrend
2D grafikában egy sprite vagy előtte vagy mögött van egy másik sprite-nak. Semmiképp nem lehetséges, hogy A. sprite egyik része előrébb van B. sprite-hoz képest, de A. sprite másik részei hátrébb vannak. Ez 3D-ben furcsa kinézethez vezet. Lásd a videót.
Több szabály is létezhet arra, mi alapján teszi sorrendbe a játékmotor a megjelenítendő sprite-okat és melyik sprite kerül megjelenítésre előrébb.
Alapesetben a Unityben ennek sorrendjét a kép egy bizonyos pontjának kamerához való távolsága dönti el. Az, hogy a kép melyik pontját veszi alapul a motor, azt a Sprite Sort Point-ban állíthatjuk be. (Ortografikus kamera esetén, csak a kamera tengelye mentén vett távolság számít.)
- SortingLayer és SortingOrder
- amelyiknek magasabb szintű a Sorting Layer-e. Ha ez megegyezik, akkor…
- amelyiknek magasabb a Sorting Order száma. Ha ez is megegyezik, akkor…
- amelyik közelebb áll a kamerához.
- Egyébként véletlenszerű
Ezt felülírhatjuk manuálisan a Sorting Layerrel és orderrel. A Sorting Layer egy kategória, amiből bárhányat hozzáadhatunk a projekthez. Pl: UI, Előtér, Játéktér, Háttér.
A Sorting Order pedig egy integer szám. Minél magasabb ez a szám annál előrébb lesz a sprite.
Szóval a kirajzolási sorrendet eldöntő algoritmus a következő: Két sprite közül az van előrébb…
A Pixelgrafika
Egy speciális módja a 2D képalkotásnak a pixelgrafika: Ezzel bővebben itt foglalkozunk: