Az OnValidate
metódus a Start-hoz hasonlóan egy speciális Unity MonoBehaviour ü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 */ }
Ahogy például a Start
metódus akkor fut le amikor a komponens létrejön a játékban, az OnValidate
metódus mindig akkor fut le, amikor:
- A Unity újra fordítja a kódunkat (mert változtatunk rajta.) vagy
- Az Inspector felületen változtatunk a komponens egy
[SerializeField]
változóján.
A Start
vagy Update
metódus mindig csakis Play módban fut le. (A játék futása közben),
Ezzel szemben az OnValidate
-et a Play módon kívül is meg fogja hívni a Unity.
Az OnValidate
tisztán egy fejlesztői eszköz és sosem fog lefutni a végleges build-ben. Ennek oka, , hogy az OnValidate
arra szolgál, hogy előzetes beállításokat végezzünk benne a fejlesztés alatt és nem, az hogy futás közben végezzen műveleteket.
Nézzünk egy példát arra, milyen automatikus műveleteket végezhet az OnValidate
:
[SerializeField] float someNumber = 1;
[SerializeField] Camera camera;
[SerializeField] Collider collider;
void OnValidate()
{
// Biztosítjuk, hogy egy beállítás változó nem vesz fel bizonyos tiltott értékeket.
if(someNumber > 10) // someNumber változó értéke nem lehet 10-nél nagyobb
someNumber = 10;
if(camera == null) // Ha nincs referenciánk a kamerára
camera = Camera.main; // bekötjük
if (camera!=null && camera.orthographic == false) // Ha a Camera nem ortografikus
camera.orthographic = true; // Átállítjuk
if(collider == null) // Ha nincs referenciánk a colliderünkre,
collider = GetComponent<Collider>(); // megtaláljuk és bekötjük
}
Ez csak néhány példa volt. Ezeken kívül tetszőleges mennyiségű egyéb felhasználás is elképzelhető. Lényeg, hogy a OnValidate
-ben mindig valamiféle fejlesztői automatizációt végzünk.