A karakterünk mellett két további fontos dolog hiányzik még a játékterünkről: a talaj és a kurzor. Ebben a részben ezeket fogjuk létrehozni.
A talaj
Két okból nagyon fontos a talaj: vizuálisan jobban néz ki, hogy a kaktusz nem a levegőben mászkál, illetve kell valamilyen felület, amelyen láthatjuk a kurzorunkat. A későbbiekben ez a felület a HoloLens által feltérképezett tér lesz, de most bőven elegendő, ha lehelyezünk egy egyszerű objektumot:
- A Hiearchy panel bal felső sarkában kattintsunk a Create -> 3D Object -> Plane lehetőségre
- Válasszuk ki a létrehozott objektumot, majd az Inspector panel legfelső beviteli mezőjében nevezzük át “Ground”-ra
- Ugyanúgy az Inspectorban a Transform komponens Scale X és Z tulajdonságát állítsuk 250-re
Így kaptunk egy megfelelő méretű talajt, természetesen bármekkora méretű lehet.
Ami számomra nem tetszik, az a talaj színe, a fehér nem a legjobb választás. Hozzunk létre egy egyedi anyagot hozzá!
- Alul, a Project fülön az Assets mappában hozzunk létre egy Materials mappát: Assets -> jobb klikk -> Create -> Folder
- Válasszuk ki a mappát, majd: jobb klikk -> Create -> Material
- Nevezzük el GroundMaterial-nak
- Válasszuk ki, majd az Inspector Albedo tulajdonságát változtatva módosíthatjuk a színét. Válasszunk ki egy tetszőleges színt.
Ezután már csak alkalmazni kell az adott anyagot a talajunkon. Ehhez válaszuk ki a Hiearchy-ban a Ground objektumot, majd ragadjuk meg a GroundMaterialt és húzzuk rá a Ground objektumra (az “Add Component” gomb alá van erre lehetőségünk).
A kurzor objektum
A kurzor egy jégkorongra fog hasonlítani, amely folyamatosan a talaj felett fog mozogni.
- Adjunk hozzá egy Cylinder objektumot a Hiearchy gyökerébe
- Position: X: 0, Y: 0.05, Z: 50
- Scale: X: 16, Y: 0.1, Z:16
- Nevezzül el Cursornak
Scriptelés
Ahhoz, hogy a kurzor objektum kövesse a kurzorunkat, kell írnunk egy egyedi scriptet.
A script egy Raycastot (azaz egy láthatatlan lézersugárt) fog küldeni a kamerából a kurzor pozícióján keresztül a talajra. Majd, ha az eltalált valamilyen collidert, a találat pozíciójába fogja mozgatni a kurzor objektumunkat.
Hozzunk létre az Assets mappában egy Scripts mappát, azon belül pedig egy új C# scriptet MoveCursor néven.
Nyissuk meg a scriptet szerkesztésre.
Mint ahogy azt az előző blogposztomban írtam, minden script a MonoBehavior osztályból származik. Ez adja meg az alap funkcionalitást, hogy scriptjeink komponensként működjenek.
Miután megnyitottuk a scriptünket az alap Unity által generált sablon scriptet látjuk, a Start() és az Update() fügvényekkel:
- Start() – itt érdemes minden olyan kezdeti beállítást végrehajtani, amelyek másik objektumokkal kommunikálnak. Ez a függvény egyszer fog lefutni
A párja az Awake(), amely szintén egyszer fut le. A különbség az, hogy az Awake() előbb fog meghívódni, mint a Start(), és sok dolog nem érhető el az Awake()-ben. Tehát ezt mint egy konstruktorként érdemes használni, ahol felépítjük az objektumot. Pl. mi itt fogjuk a kurzor GameObejcthez a referenciát elkérni a Tag alapján. - Update() – ez a lényege minden scriptnek. Minden egyes képkocka renderelésekor lefut egyszer.
A párja a FixedUpdate(), amely annyiban különbözik, hogy fix időintervallumonként hívódik meg, függetlenül attól, hogy épp mennyi ideig tart egy adott képkockát kirenderelni. Tehát, ha épp kevesebb erőforrás jutott a játékunknak és tovább tartott az adott képkocka renderelése, az Update()-ben szereplő logika is később fog meghívódni a FixedUpdate()-el ellentétben. A FixedUpdate()-ben a fizikával (mozgás, erők, stb.) kapcsolatos mechanizmusokat érdemes végrehajtani. Mi itt fogjuk a kurzor objektumunkat mozgatni.
Ezeken felül a Unity scriptek számos másik overrideolható függvénnyel rendelkeznek, amelyekről bővebben a dokumentációban olvashatsz.
Az alábbi kód bemásolásával tehető lehetővé, hogy a kurzor objektum kövesse az egér mozgását.
using UnityEngine; public class MoveCursor : MonoBehaviour { void FixedUpdate() { RaycastHit hit; Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); if (Physics.Raycast(ray, out hit)) { transform.position = new Vector3(hit.point.x, 0, hit.point.z); } } }
A RaycastHit egy olyan objektum, amely a Raycast által eltalált collider ütközésének helyéről szolgáltat információkat, pl. a World koordinátáit.
Tehát a kamerából az egér pozícióján át vetített Raycast talajjal való ütközési pontjának koordinátáit kapja meg a kurzor objektum. Itt csak az x és a z koordinátákra van szükségünk, mivel csak is az a két koordináta mentén mozgatjuk kurzorunkat.
Az eddigiek alapján látszik, hogy milyen egyszerű új objektumokat létrehozni és azokat scriptelni. A következő részben be fogjuk fejezni a demót és végre mozogni fog kaktuszunk.
A sorozat részei:
- Alapok
- A legfontosabb koncepciók
- A pálya létrehozása és a kurzor mozgatása
- Karakter mozgása és animációk
A projekt a leírás sorrendjében végrehajtva megtalálható Githubon a projekt Dev branchén.
Leave a Reply