Jump to content
Unity Insider Forum

SetActive oder enabled


MichaelH
 Share

Recommended Posts

Moin,

in meinem Projekt befinden sich mehrere Level die in Sektoren aufgeteilt sind.

level.png.95e559fd87ce151de5c0fcee2195b773.png

Diese Sektoren möchte ich nach Bedarf (PlayerPosition, Portal etc.) aktivieren oder deaktivieren.

Welche Methode ist dafür besser geeignet, oder ist das egal ? Welche Vor- und Nachteile ergeben sich daraus ?


    public void ActivateSector(Vector2 pos, bool state)
    {
        transform.GetChild(GetSectorIndex(pos)).gameObject.SetActive(state);
    }

    public void EnableSector(Vector2 pos, bool state)
    {
        transform.GetChild(GetSectorIndex(pos)).GetComponent<Sector>().enabled = state;
    }

 

Link to comment
Share on other sites

Ich schalte ja in beiden Fällen das gesammte Childobject an oder ab (den Sector).

Meine Frage geht mehr in die Richtung ob in beiden Fällen beim "Einschalten"  die Callbackfunktionen Awake und Start neu aufgerufen werden oder

es vielleicht sogar besser ist Kopien der Prerfabs zu Instanzieren und zu Destoyen wenn man das möchte ?

Ich weiß eben nicht wie Unity das intern so handhabt.

 

Link to comment
Share on other sites

Das kannst du ja leicht ausprobieren, wenn du in die Start und Awake ein Debug.Log rein tust.
Aber ich kann es dir auch so sagen.
Wenn ein Objekt in der Szene erscheint, wird die Awake ausgeführt, auch wenn das Script selber eigentlich nicht enabled ist. Sobald das Script enabled wird, wird auch die Start ausgeführt.

Das macht er aber insgesamt nur einmal. Awake und Start werden nicht nocheinmal ausgeführt. Bei OnEnable und OnDisable würde jedes mal beim Aktivieren/Enablen etwas ausgeführt werden, falls du das nutzt.

Link to comment
Share on other sites

Am 29.9.2021 um 20:32 schrieb MichaelH:

Ich schalte ja in beiden Fällen das gesammte Childobject an oder ab (den Sector).

Ne, mit enabled schaltest du nur die Komponente ab. Das GameObject selbst ist noch an, und wenn das "Sector"-GO selber noch Kindobjekte haben sollte, dann gehen die mit SetActive mit aus, mit enabled aber nicht. Ist ja nur die Komponente.

Der Ablauf der Events ist:

  • Komponente wird erstellt (wird mit Szene geladen, AddComponent oder Instantiate)
  • Wenn das GameObject schon aktiv ist (kann ja deaktiviert spawnen)
    • Awake
  • Wenn das GameObject und die Komponente beim spawnen beide aktiv sind
    • OnEnable
  • Code nach dem Erstellen (Instantiate/AddComponent) wird ggf aufgerufen
     
  • GameObject wird das erste mal aktiviert*, wenn es nicht schon aktiv war
    • Awake
  • Komponente oder GameObject wird aktiviert, sodass nun beide aktiv sind
    • OnEnable
  • Ende des Frames nach der ersten Aktivierung
    • Start
       
  • Komponente oder GameObject wird deaktiviert, vorher waren beide aktiv
    • OnDisable
  • Komponente oder GameObject wird zerstört
    • Komponente wird deaktiviert (OnDisable) wenn noch aktiv
    • OnDestroy

* Komponenten auf inaktiven GameObjects kriegen also kein Awake ab, bis das GO einmal aktiviert wird.

Edit: Inhaltliche Korrektur

Link to comment
Share on other sites

Was hast du befürchtet?
Was hast du denn in deine Sektoren rein gebaut, dass es in deinen Augen problematisch sein könnte?

Übrigens hat sich @Sascha mit der Awake etwas falsch ausgedrückt.
Wenn ein GO in einer Szene erwacht, egal ob es von Beginn an aktiv da war oder erst später aktiviert wird, wird die Awake Funktion des/der Scriptkomponent(n) ausgeführt.
Auch wenn diese Komponente(n) nicht enabled ist/sind !
Genauso werden auch OnCollision oder OnTrigger Events ausgeführt, egal ob das Script aktiv ist oder nicht.

Ich habe vor Jahren mal eine Grundlagen-Reihe auf YT erstellt, wo genau dieses Awakeverhalten gezeigt wird.
Hier kannst du ja mal rein gucken. (Es ist schon zur richtigen Position vorgespult.)

 

Link to comment
Share on other sites

vor 29 Minuten schrieb malzbie:

Übrigens hat sich @Sascha mit der Awake etwas falsch ausgedrückt.
Wenn ein GO in einer Szene erwacht, egal ob es von Beginn an aktiv da war oder erst später aktiviert wird, wird die Awake Funktion des/der Scriptkomponent(n) ausgeführt.

Ich hab mich nicht falsch ausgedrückt, ich habe das ganz genau so gemeint ;)

Hab's aber nochmal ausprobiert. Wieder was dazu gelernt! Ich war mir sicher, dass Awake bei einer deaktivierten Komponente nicht ausgeführt wird - tatsächlich darf nur nicht das GameObject deaktiviert sein. Danke!

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

×
×
  • Create New...