Developedia
Developedia
Hello Unity: Első Unity programunk

Hello Unity: Első Unity programunk

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

icon
Script / 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.
image
  • 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.

image

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édletVisual 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ó.
  • 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.

  • 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!
  • image
  • Kattintsunk felül középen a háromszög alakú Play gombra!

A fenti kód hatására a következő üzenet jelenik meg a konzolablakban

image

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Ö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)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”.

icon
MonoBehaviour message method / üzenetmetódus

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.

Logo

Főoldal

Blog

Elmélet

3D Studio

Adatvédelmi nyilatkozat

GY.I.K.

Házirend

Szerző: Marosi Csaba / marosi.csaba@3d-studio.hu

DiscordGitHubLinkedIn