Lehetőségünk van manuálisan és kódból is ki- és bekapcsolni GameObject-eket valamint a komponensek némelyikét is.
A be- és kikapcsolt állapotot így nevezik az egyes esetekben:
GameObject: active / inactive
Komponens: enabled / disabled
Komponensek ki és bekapcsolása
Komponenseket manuálisan ki- és bekapcsolni, az inspector ablakon a komponens neve mellett bal oldalt tudjuk megtenni, egy checkbox segítségével.
Ezt a lehetőséget nem mindenhol fogjuk megtalálni, csak ott ahol a bekapcsoltság értelmezett (azaz van bármi jelentősége).
Kóddal a GameObject enable nevű bool típusú field-jén keresztül kérdezhető le és állítható be egy komponens “bekapcsoltsága”. (Igazából ez nem egy field, csak úgy néz ki.)
Debug.Log($"Be van kapcsolva: {component.enabled}"); // Lekérdezés és kiíratás
component.enabled = true; // Bekabcsolás
component.enabled = false; // Kikapcsolás
// Megszokott módon nem kell az adott komponens referenciáját kiírni,
// ha saját magunkra (az éppen írt komponensre) hivatkozunk.
Ahogy az Editor felületen sem mindenhol van be- és kikapcsoló checkbox, úgy kódból sem minden típusú komponens esetén állítható ez.
Ha egy komponens kikapcsolt állapotban van, akkor a hatása nem tapasztalható a játékban. A Renderer nem jelenít meg semmit, a Collider nem érintkezik semmivel. Stb…
MonoBehavior-ok esetén nem fognak kikapcsolt komponensnek lefutni az olyan automatikus Unity életciklus metódusai, mint a Start vagy az Update.
Ez alól kivételt képeznek azok a metódusok, amik amúgy is csak az Editorban futnak. Ezek meg fognak hívódni kikapcsolt komponenseknek is. Ilyenek az:
- OnValidate,
- OnDrewGizmos
- OnDrawGismosSelected
OnEnable, OnDiable
Itt érdemes megjegyezni két új automatikusan hívott MonoBehaviour metódust, amik a komponens be és kikapcsolásakor futnak le:
- void OnEnable( ) - bekapcsoláskor
- void OnDisable( ) - kikapcsoláskor
A frissen létrehozott komponensek OnEnable metódusa mindig lefut még az első Start hívás előtt.
Az egyszerre keletkező MonoBehaviour-ok esetén az összes OnEnable metódus lefut az első Start hívás előtt. Ez azt jelenti, hogy Scene a betöltésekor is a Unity meg fogja hívni az objektumok mindegyikére a OnEnable-t, mielőtt hívná az első Start-ot.
Az OnEnable és az OnDisable mindig csak Play módban futnak csak le. (Kivétel itt: Hasznos Unity attribútumok, ExecuteAllways)
GameObject-ek ki- és bekapcsolása
Ha GameObject-eket akarunk ki- és bekapcsolni, akkor azt megtehetjük az editor felületen az inspector ablak bal felső részén, a név mellett lévő checkbox segítségével.
A következő módon aktválható és deaktiválható kódban egy GameObject:
[SerializeField] GameObject otherGameObject;
void OnValidate()
{
// Az adott komponenshez tartozó GameObject lekérhető így:
GameObject self = gameObject;
// GameObject aktív állapotának lekérdezése:
// A GameObject maga és az összes szülője aktív-e?
bool isSelfAndAllItsParentsActive = gameObject.activeInHierarchy;
bool isOtherAndAllItsParentsActive = otherGameObject.activeInHierarchy;
// A GameObject maga aktív-e?
bool isSelfActive = gameObject.activeSelf;
bool isOtherActive = otherGameObject.activeSelf;
// A GameObject aktív állaotának beállítása:
// Ez csak az adott GameObject-et állítja, a szülő GameObject-eket nem.
gameObject.SetActive(true);
otherGameObject.SetActive(false);
}
A fenti kódban megfigyelhető hogy egy GameObject esetén kétfajta “bekapcsoltság” értelmezhető.
Mivel egy kikapcsolt GameObject minden gyereke is teljesen úgy viselkedik, mint ha ki lenne kapcsolva, azért nem csak az számít, hogy egy GameObject saját maga aktív-e, hanem hogy ő és minden szülője is aktív-e.
Ha egy GameObject ki van kapcsolva, az sok szempontból úgy viselkedik, mintha nem is létezne.
A gameObject minden komponense olyan állapotba kerül, mintha ki lenne kapcsolva.
Ha a GameObject kikapcsolódik, akkor a komponenseinek és a gyerekei komponenseinek meghívódik az OnEnable és az OnDisable metódusa.
Fontos hogy a kikapcsolt állapot egy GameObject esetén nem jelenti azt, hogy az egy időre teljesen megszűnik létezni. A GameObject és komponensek referenciái nem szűnnek meg, még mindig lekérhető és állítható ezek minden tulajdonsága, hívható minden függvénye kikapcsolt állapotban is. Egyedül a Unity fogja máshogy kezelni őket. Pl.: nem hívja automatikusan az Update metódust.