Ahogy korábban láttuk a Renderer kifejezést tartalmazó komponensek, azok, amik megjelenítenek valamit a játékos számára. Eddig két ilyen komponenssel ismerkedünk meg. Egyik a jellemzően 2D képalkotáshoz használt SpriteRenderer (2D képalkotás), a másik pedig a 3D formák megjelenítésére szolgáló MeshRenderer (
3D képalkotás).
Most megismerjük a harmadik Renderer típusunkat, a LineRenderer-t, ami egy elnyúló vonalalt jelenít meg. A LineRenderer egy megadott pontsorozathoz legyárt egy mesh-t (megjeleníthető háromszöghálót) a komponens beállításaitól függően és megjeleníti azt. Például az alábbi képen egy 5 kontroll-pontból álló pálya látható. Természetesen a mesh nem 5 vertex-ből (mesh sarokpontból) áll, hanem attól jóval többől.
Most fussuk át a komponens leggyakrabban használt beállításait:
Positions - A kontrollpontok felsorolása. Ez 3D vektorok egy tömbje melynek minden eleme egy pozíció/ helyvektor a kirajzolandó pályán. Általában ezt a beállítást kód szokta vezényelni. Erről később részletesen…
Use World Space - Egy eldöntendő (bool) beállítás, ami azt adja meg, hogy a beállított kontroll-pontok világkoordinátában értendők-e vagy saját koordinátákban. (A lokális és globális tér)
Material - Ahogy az összes eddig megismert renderer, a Line Renderer is tartalmat egy hagyományos material beállítást, ami felel azért, hogy megjelenítse a mesh felszínét.
Mesh generálás
A következő beállítások azért felelnek, hogy hogyan történjen a mesh generálása a kontroll-pontokból
Corner Verticles - Hány vertexből álljon egy sarok külső része?
End Cap Verticles - Hány vertexből álljon a vége a vonalnak?
Íme például három Line Renderer különbözö Corner Verticles, és End Cap Verticles számokkal: Bal oldalt: CV=0, ECV=0 Középen: CV=3, ECV=0, Jobb oldalt: CV=3, ECV=3
Alignment - Azt adja meg, hogy az egyes pontok külön-külön megpróbáljanak -e a fő kamera felé fordulni, vagy egyszerűen kövessék a Transform komponens 3D orientációját.
Szín és vastagság
Egy LineRenderer-nek színt egy Gradiens, azaz színeátmenet segítségével lehet adni. Ebbe persze beletartozik az opacitás/alfa csatorna is. Fontos azonban kiemelni, hogy csak a kontrollpontokon fog mintavételezés történni a gradiensből, azaz ha nincsenek elég sűrűn a kontroll-pontok, akkor a gradiens megjelenítése akár lehet pontatlan is:
Ugyanez e helyzet a vonal vastagságával, amit egy Görbe segítségével lehet beállítani. Ott is csak a kontrollpontok helyein történik mintavét ebből a görbéből.
Pontok megadása kódból
A LineRenderereket jellemzően úgy használjuk, hogy egy kód vezényli a pontok pozícióját. Ezt a következő módon lehet megtenni lehet megtenni, hogy:
// 1. Megadjuk hány pontból áll a vonalunk:
lineRenderer.positionCount = pointCount;
// 2. Egyenként beállíjuk a megfelelő pontok térbelio pozícióját:
for (int i = 0; i < pointCount; i++)
{
Vector3 point;
// ... Valahogy kiszámoljuk a vektor értékét ...
lineRenderer.SetPosition(i, point);
}Példa 1: Szinusz függvény
Vegyük a következő példát: Rajzoljunk ki egy szinusz-függvényt tetszőleges beállításokkal!
- Vegyük fel a megfelelő beállításokat a komponenshez, ami kirajzolja a hullámot.
- Vegyük fel a megfelelő beállításokat a
- Vegyük fel a megfelelő beállításokat a
// A fázis automatikus változásának sebessége futás közben
[SerializeField] float speed = 360;
void Update()
{
phase += speed * Time.deltaTime; // Futás közben változik a hullám
UpdateWave();
}Példa 2: Procedurális cigarettafüst
A fenti példa kicsikét továbbfejlesztett változata lehet egy cigarettafüst mozgását szimuláló kód.
Ebben az esetben több beállítható szinusz és animációs görbét adtam valamint szoroztam össze, hogy megkapjam a kívánt eredményt.
A TrailRenderer
A TeailRenderer gyakorlatilag nem több egy LineRenderer, ami folyamatosan követi az objektumot, amihez hozzá van rendelve. Ez csak annyit jelent, hogy a pontok frissítését ebben a speciális esetben nem kell nekünk megoldani. A Unity-sek már megtették helyettünk.
Ugyanúgy néz ki a komponens beállítási felülete, mint egy LineRenderer-é csak kiegészítve egy-két extra mezővel, ami a követő vonal dinamikus viselkedését érinti.