Az attribútumok lehetőséget biztosítanak arra, hogy olyan programozási elemeket, mint típusok, mezők és metódusok, stb. kiegészítő információkkal ruházzunk fel.
Főleg arra a célra lettek az attribútumok megalkotva, hogy kiegészítsék a C# nyel funkcionalitását olyan keretrendszerek számára, mint a Unity, ami hozzá tud férni ezekhez a kiegészítő információkhoz és működését ehhez mérten tudja módosítani.
Egy attribútumnak mindig adott, hogy miféle programozási elemek-hez rendelhető.
A Unity Engine sok hasznos attribútumot nyújt számunkra. Nézzünk gyors át párat a legfontosabbak közül: Olyanokat, amikkel már találkozhattatok itt és olyanokat is, amiket még nem ismertek.
Hogy mik azok az attribútumok, arról itt olvashatsz bővebben:
[SerilaizeField]
Hozzárendelhető: field-hez
Ezt az attribútumot már jól megszokhattuk, gyakran kell használnunk.
Azt teszi, amit a neve sugall: Egy field-ről jelzi, hogy azt szerializálni kell. Ez a Unity kontextusában azt jelenti, hogy a mező megjelenik az Inspector ablakon, értéke beállítható és a beállított érték elmentődik a Scene-nel vagy Prefab-bal. Ezután ha betöltjük a Scene-t vagy prefabot, akkor a Unity a mentett értékeket beinjektálja az újonnan létrehozott objektumokba.
Ezáltal egy [SerilaizeField] változó gyakorlatlag egy beállításmező szerepét tölti be.
(A programozás Unity-n kívüli szélesebb spektrumán a Szerializálás azt jelenti, hogy egy programozási nyelv egy objektumát átalakítjuk (menthető) adattá. Ez az adat lehet szöveges, vagy bináris formájú. Az adat visszaalakítását objektummá pedig deszerializálásnak nevezzük.)
Ha egy Unity osztályváltozó publikus, akkor nem kell kiírni a [SerilaizeField]
attribútumot.
[Range]
Hozzárendelhető: int
vagy float
field-hez
Némely attribútumnak paraméterei is vannak, akár egy függvénynek. Ebben az esetben is a paramétereket zárójelek közé kell írni megadott sorrendben. A range is ilyen.
A [Range]
egy szám (int/float) típusú field-hez rendel egy minimális és egy maximális értéket, ami beállítható az inspector ablakon.
Fontos, hogy az itt beállított értéknek csak az inspector ablakon van jelentősége. Kódból pont ugyanúgy állítható egy ilyen változó bármilyen értékre, mint bármely egyéb int és float field.
[SerializeField] [Range(-100,100)] int someVariable1 = 1;
[SerializeField, Range(0f,1f)] float someVariable2 = 0.5f;
Mint a fenti példában is látható, ha több attribútumot adunk egy elemhez akkor tehetjük őket több külön vagy csak egy szögletes zárójelbe is, utóbbi esetén vesszővel elválasztva.
[Min]
Hozzárendelhető: int
vagy float
field-hez
Minimum beállítható értéket rendel egy számhoz.
Működése megegyezik a [Range]
-ével, csak itt nincs maximum paraméter.
[Header]
Hozzárendelhető: field-hez
Szerializált field-eket, csoportosíthatunk úgy, hogy fejléceket teszünk a csoport első eleme elé a [Header]
attribútummal.
Az attribútumnak egy string típusú paramétere van: A fejléc szövege.
[Space]
Hozzárendelhető: field-hez
Szerializált field-eket, áttekinthetőbbé tehetünk úgy is, hogy szünetet hagyunk egy változó előtt a [Space]
attribútummal. A [Space]
-nek nincs paramétere.
[HideInInspector]
Hozzárendelhető: field-hez
Szerializált field-ek megjelenítését az inspektor ablakon letilthatjuk a [HideInInspector] attribútummal.
Ezt jellemzően úgy használjuk, hogy a változó értékének beállítását OnValidate-ben elvégezzük.
Ekkor a mentés és visszatöltés automatikusan megtörténik, de a beállítást kód végzi, nem pedig valaki manuálisan az Editor felületen.
[SelectionBase]
Hozzárendelhető: MonoBehaviour osztály-hoz
Ez az GameObject lesz a kijelölés alapja. Ez azt jelenti, hogy ha egy gyerek objektumra kattintunk, akkor is az a szülő objektumot jelöljük ki Unity-ben, amin van olyan komponens, amihez a SelectionBase attribútumot hozzáadtuk.
Érdemes lehet belőle egy teljesen önálló, üres komponenst is készíteni, amit ha hozzáadunk bármely GameObject-hez, akkor a kijelölés alapja lesz.
using UnityEngine;
[SelectionBase] public class SelectionThis : MonoBehaviour { }
[RequireComponent]
Hozzárendelhető: MonoBehaviour osztály-hoz
Nyilatkozni tudunk róla, hogy ezen az osztály mellé (vele azonos GameObjectre) szükségünk van egy vagy több egyéb komponensre.
[RequireComponent(typeof(Rigidbody2D), typeof(Collider2D))]
class SmoeComponent : MonoBehaviour
// ...
Ha több ilyen komponenstípus van, akkor őket vesszővel választjuk el.
[DisallowMultipleComponent]
Hozzárendelhető: MonoBehaviour osztály-hoz
Ezzel gátolhatjuk meg, hogy ebből a komponensből ne rakhassunk többet egy GameObject-re.
[ExecuteAlways]
Hozzárendelhető: MonoBehaviour osztály-hoz
Az ezzel az attribútummal megjelölt MonoBechaviour komponensek bizonyos életciklus metódusait, amit egyébként csak Play módban futnánk le, a Unity hívni fogja Play módon kívül is.
- Update - Lefut, playmódon kívül, ha a Scene megváltozott.
- Awake - Lefut ha a komponens hozzá lett adva a GameObject-hez.
- OnEnable, OnDisable - Be- és kikapcsolásra, hasonlóan a play módhoz.
- …
Play módon belül, hasonlóan viselkednek, a hagyományos komponensekkel.
Ha azt szeretnénk elérni, hogy ne ugyanaz a kód fusson Play módon belül és kívül valamelyik üzenetmetódusban, akkor a Application.isPlaying lekérdezéssel tudjuk elkülöníteni a két működést.
void Update()
{
if (Application.isPlaying)
UpdatePlay();
else
UpdateEditor();
}
[InitializeOnLoad]
TODO
[MenuItem(string)]
A Unity Editor felső menüsávjából elérhető automatikus parancsokat hozhatunk létre, ha ezt az attribútumot egy statikus metódushoz rendeljük. Paraméterben megadható, hogy hova tegye a parancshoz kapcsolódó gombot. Pl.:
[MenuItem("Tools/Useless Stuff/Do Something")]
public static void DoSomething()
{
Debug.Log("I did something. Yey!");
}
Módosítók:
- % - Ctrl (Windows, Linux) vagy Cmd (macOS)
- ^ - Ctrl (Windows, Linux, macOS)
- # - Shift
- & - Alt