MichaelH Geschrieben 29. September 2021 Melden Share Geschrieben 29. September 2021 Moin, in meinem Projekt befinden sich mehrere Level die in Sektoren aufgeteilt sind. 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 29. September 2021 Melden Share Geschrieben 29. September 2021 Naja - mit enabled schaltest du eine einzelne Komponente an oder aus. Mit SetActive das ganze GameObject, inklusive aller dessen Komponenten und Kind-Objekten. Was du nimmst, sollte also davon abhängen, was davon du willst. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MichaelH Geschrieben 29. September 2021 Autor Melden Share Geschrieben 29. September 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 29. September 2021 Melden Share Geschrieben 29. September 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MichaelH Geschrieben 30. September 2021 Autor Melden Share Geschrieben 30. September 2021 Danke dir. Das hilft 😃 Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 30. September 2021 Melden Share Geschrieben 30. September 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
MichaelH Geschrieben 30. September 2021 Autor Melden Share Geschrieben 30. September 2021 Ich habs befürchted, ich werd meine Projektstruktur wohl nochmal überarbeiten müssen, aber deswegen hab ich ja nachgefragt. Dank dir. Link zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
malzbie Geschrieben 1. Oktober 2021 Melden Share Geschrieben 1. Oktober 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Sascha Geschrieben 1. Oktober 2021 Melden Share Geschrieben 1. Oktober 2021 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 zu diesem Kommentar Auf anderen Seiten teilen More sharing options...
Recommended Posts
Archiviert
Dieses Thema ist jetzt archiviert und für weitere Antworten gesperrt.