A Unity program egészen máshogy működik, mint egy önállóan a nulláról megírt szoftver.
Korábban azt tanultuk, hogy minden programnak van egy belépési pontja és innentől kezdve tudunk utasításokat adni. Bár ez Unity alatt is igaz, de mi nem férünk hozzá ehhez a belépési ponthoz. Ezt már megírták helyettünk, a motor része.
Más módon fogjuk végezni a programozást Unity-ben: Szkripteket fogunk írni, amiket vizuálisan hozzácsatolunk térbeli objektumokhoz a Unity Editor felületén.
A szkript
Szkriptnek azokat az apró programrészeket nevezzük, amik egy nagyobb programrendszerbe épülnek be.
A Unity szkriptnyelve a C#, amivel úgy nevezett MonoBehavour
szkripteket építhetünk be szoftverünkbe.
MonoBehavour
szkripteknek nevezzük azokat az általunk írt önálló kódokat, amiket a Unity-be közvetlenül be tudunk ágyazni. Ez az elsődleges eszközünk, ami képessé tesz minket arra, hogy saját kóddal manipulálni tudjuk a Unity program működését. Hamarosan látni fogjuk, hogyan.
A szkriptek működése többé kevésbé önálló.
Léteznek nyelvek, amiket kifejezetten egy konkrét keretrendszer szkript-nyelveként alkottak meg. Ezen szkript nyelvek funkcionalitása gyakran korlátozott és csak az adott keretrendszerhez illeszkedik. A C# nem tartozik ebbe a kategóriába. A C# egy általános programozási nyelv, amit a Uniy szkriptelésre is használ.
Unity és IDE előkészítése
Mielőtt elkezdenénk kódolni győződjünk meg arról, hogy a Unity-nek be van állítva a Visual Studio, mint IDE (Integrated Development Environment = kódszerkesztő).
Ezt a következőképp tudjuk megtenni:
- Megnyitjuk a preferenciákat a Unity Editorban: Felső menüsáv / Edit / Preferences / External Tools
- Ha az External Script Editor beállításban az “Open by file extension” szerepel itt, akkor ezt cseréljük le a megfelelő IDE-re, ami a mi esetünkben Visual Studio Community 2022.
- Ha a Visual Studio nincs a listában, az azt jelenti, hogy telepíteni kell a megfelelő IDE bővítményét:
Felső menüsáv / Window / Package Manager / Unity Registry / Visual Studio / Install
Megjegyzés: A Visual Studio Code is egy IDE a Microsofttól, de egy teljesen más szoftver.
Ha ez után sem szerepel a Visoual Studio az External Script Editor legördülő menüjében, akkor maga a Visual studio sincs telepítve.
Ehhez segítség itt taláálható: Visual Studio - Telepítési segédlet
Első Unity szkriptünk
- Hozzunk létre egy új szkript fájlt: Assets mappán belül / Jobb egérgomb / Create / C# script
- Nevezzük el HelloUnity.cs-nek!
- Nyissuk meg a filet az általunk választott IDE-ben. (Visual Studio 2022 Community)
- Írjuk meg a következő kódot a HelloUnity.cs file-ban, majd mentsük el!
using UnityEngine;
class HelloUnity : MonoBehaviour
{
void Start()
{
Debug.Log("Hello Unity");
}
}
- Figyeljünk arra, hogy a file kiterjesztés (.cs) nélküli neve egyezzen meg az osztály nevével.
Ez a
class
kulcsszó utáni rész. Jelen példában ez a “HelloUnity” azonosító. - Hozzunk létre egy új GameObject-et a Scene-ben! Jobb gomb a Hierarchy ablakban / Create Empty
- Adjuk hozzá a szkriptet komponensként a GameObject-hez az Inspector ablakon az ”Add Component” gombbal!
- Kattintsunk felül középen a háromszög alakú Play gombra!
Ez minden esetben szükséges, ha MonoBehaviour
scriptekről van szó. Ellenkező esetben nem fogja a Unity felismerni az osztályt szkript-nek, amit speciális módon hozzáadhatunk a projekthez.
A fenti kód hatására a következő üzenet jelenik meg a konzolablakban
Tekintsük át az eddigi kódunkat!
Mit is tettünk eddig?
A UnityEngine névtér
using UnityEngine;
Ezzel a sorral megmondtuk a C# fordítónak, hogy ebben a fájlban akarjuk használni a UnityEngine névteret.
A névtérre tekinthetünk úgy, mint egy szeparált adagnyi programkódra.
A UnityEngine névtér tartalmazza egy Unity program fejlesztéséhez szükséges alapvető elemeket.
Osztály létrehozása
class HelloUnity : MonoBehaviour { ... }
Ezzel a sorral létrehoztunk egy osztályt és a HelloUnity
nevet adtuk neki.
Hogy mi az, hogy osztály, azt egyelőre nem definiáljuk pontosan. Igeiglenesen legyen elég annyi, hogy egy programozási projekt olyan része, ami egy jól elkülönülő feladatát látja el.
Később itt lesz róla szó: Összetett típusok és példányaik
Az új osztályunk MonoBehaviour
típusú, azaz leszármazik a MonoBehaviour
nevű szülő osztályból. Ez számunkra a gyakorlatban azt fogja jelenteni, hogy felhasználható, mint Unity komponens.
A leszármazásról itt lessz szó valamivel bővebben: Objektum orientáltság és öröklés (Félkész)
Az osztályokat C#-ban javasolt mindig nagybetűvel kezdeni. (Szóköz nincs)
A Start
metódus
A Start
egy úgy nevezett MonoBehaviour üzenet metódus:
Ha egy MonoBehaviour (azaz Unity komponens) típusú osztályban egy Start
elnevezésű metódus szerepel, akkor ezt a metódust a Unity a komponens létrejöttekor automatikusan végrehajtja, azaz “meghívja”.
Amikor egy MonoBehaviour osztályt írunk, akkor adhatunk hozzá speciális, előre meghatározott nevű és paraméterezésű metódusokat. Ezeket a Unity automatikusan meghívja (lefuttatja / végrehajtja) egyszer vagy többször bizonyos események hatására. Ez minden egyes komponens példányra megtörténik, ami betöltött Scene-ben szerepel és be van kapcsolva.
Az ilyen metódusokat nevezzük MonoBehaviour üzenet- vagy eseménymetódusoknak, mivel általuk küld a Unity üzenetet a kódunk felé egy esemény megtörténtéről.
Példák:
void Start() { /* A komponens létrejöttekor fut le Play módbab */ }
void Update() { /* Minden képfrissítés előtt fut le Play módbab */ }
A későbbi, kapcsos zárójelen belüli rész a metódus törzse. Ennek tartalma fog Start
metódus esetén automatikusan lefutni pontosan azután, hogy a komponens létrejött a játékban.
Ezért fut le a Play gomb megnyomásakor is. Ekkor jön létre a GameObject a játékban és vele az összes komponense.
void Start() { ... }
A metódusokat C#-ban javasolt mindig nagybetűvel kezdeni. (Szóköz nincs).
A Start
és a hozzá hasonló üzenetmetódusok esetén ez nem is pusztán javaslat, hanem kötelező szabály. Bármit is elírunk egy üzenetmetódus nevében, a Unity nem fogja automatikusan hívni.
Üzenetek kiíratása a Unity Console-ra
Ez a parancs, ami kiírja, a paraméterben kapott adatot (zárójelen belüli részt).
Debug.Log("Hello Unity");
Hasonló a Console.WriteLine()
-hoz. Unity-ben mindig a Debug.Log()
-ot használjuk helyette.
A kód megírása után hozzáadtuk azt komponensként egy GameObject-hez. Ez a lépés nagyon fontos. Ezzel lett a szkript része a futó programnak. Ha egy script nincsen komponens formájában a Scene-ben, akkor a Unity nem fogja hívni annak üzenet metódusait.
A komponensünk egyelőre nem sokat tud, egyszerűen csak kiír egy előre megadott szöveget. Ám ehhez hasonló módon, komponensekkel fogjuk majd szabályozni a játékbeli objektumok sokkal összetettebb viselkedését.
GameObject és MonoBehaviour
Próbáljuk bővíteni kicsit a kódunkat!
Egy MonoBehaviour-on belül lekérdezhetjük a GameObject nevét a name
tulajdonsággal.
Írjuk át a Start metódust a következőképp:
void Start()
{
Debug.Log("Hello Unity");
Debug.Log($"My name is: {name}!");
}
Ebben az esetben egy komponens nem csak a Hello Unity
szöveget, fogja kiírni, hanem be is mutatkozik.
Nevezzük át a GameObject-et a saját nevünkre, indítsuk el a programot és nézzük meg, mi jelenik meg a Console ablakban!
Most másoljuk le többször a GameObject -ünket. (Ctrl+C, Ctrl+V vagy Ctrl+D) és adjunk mindnek külön nevet!
Láthatjuk, hogy a Unity felel azért, hogy automatikusan létrehozza a GameObject-eket a komponenseikkel együtt és automatikusan sorban hívja azok Start
metódusát.
Mathf
Most próbáljuk ki a Unity matematikai könyvtárát a Mathf
-et. Ez nagyon hasonlít a C#-ban megszokott Math
osztályra, hasonló metódusokkal rendelkezik.
void Start()
{
Debug.Log("Hello Unity");
Debug.Log($"My name is: {name}!");
float max = Mathf.Max(12f, 31);
float abs = Mathf.Abs(-125.3f);
float sign = Mathf.Sign(-125.3f);
}
Unity-ben mindig használj Mathf
-et, ha lehetséges, mert optimálisabb lehet, mint a Math
, aminek metódusai nem mindig működnek float
változókon, a Unity pedig technikai okokból szeret float
-okkal dolgozni a double
helyett.