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: No access
[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