Unity 3D tutorial – a pálya létrehozása és a kurzor mozgatása

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:

  1. A Hiearchy panel bal felső sarkában kattintsunk a Create -> 3D Object -> Plane lehetőségre
  2. Válasszuk ki a létrehozott objektumot, majd az Inspector panel legfelső beviteli mezőjében nevezzük át “Ground”-ra
  3. 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á!

  1. Alul, a Project fülön az Assets mappában hozzunk létre egy Materials mappát: Assets -> jobb klikk -> Create -> Folder
  2. Válasszuk ki a mappát, majd: jobb klikk -> Create -> Material
  3. Nevezzük el GroundMaterial-nak
  4. 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.

  1. Adjunk hozzá egy Cylinder objektumot a Hiearchy gyökerébe
  2. Position: X: 0, Y: 0.05, Z: 50
  3. Scale: X: 16, Y: 0.1, Z:16
  4. 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:

  1. Alapok
  2. A legfontosabb koncepciók
  3. A pálya létrehozása és a kurzor mozgatása
  4. 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

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

Create a free website or blog at WordPress.com.

Up ↑

Create your website with WordPress.com
Get started
%d bloggers like this: