2016-03-27 11 views
2

Die Unity Manual beschreibt die Reihenfolge, in der die Script-Funktionen aufgerufen werden. Ich habe mich jedoch gefragt, ob es Regeln bezüglich der Reihenfolge gibt, in der die GameObjects selbst in Unity betrachtet werden.GameObject Update-Reihenfolge in Unity

GameObjects sind im Grunde die Knoten des Szenengraphen von Unity und bilden (unter der Annahme, dass die Szene selbst der Wurzelknoten war) einen Baum. Ich habe mich gefragt, ob diese Baumstruktur irgendwelche Regeln in der Reihenfolge auferlegt, in der GameObjects berücksichtigt werden.

Wie bereits erwähnt, beschreibt das Handbuch, dass Awake() immer vor Start() aufgerufen wird, die immer vor dem ersten Aufruf an Update() und so weiter aufgerufen wird. Diese zeitlichen Beziehungen sind jedoch (meistens) im Rahmen eines einzelnen Skripts auf einem einzigen GameObject gegeben. Ich möchte wissen, ob es auch eine Regel gibt, die die Reihenfolge angibt, in der Start() (oder eine andere Methode) für alle GameObjects in der Szene aufgerufen wird.

Insbesondere wollte ich wissen:

  1. Sind Eltern immer ihre Kinder gelten vor?
  2. Werden Geschwister in der Reihenfolge betrachtet, in der sie im Szenegraphen angezeigt werden?
  3. Wird die Skriptausführungsreihenfolge nur im Rahmen eines einzelnen GameObject erzwungen, oder werden alle GameObjects berücksichtigt?
+0

Ich sollte Ihnen sagen, dass Sie Ihre Antwort mit einer grundlegenden Einrichtung von wenigen Objekten, Skripten und Kindern leicht erhalten können, dann habe ich bemerkt, dass Sie die Antwort mit der Frage gepostet haben. Jetzt kommt meine Frage, denn das ist ein triviales Problem mit einer ziemlich einfachen Antwort, warum fragen? – Everts

+0

Es ist ein Problem, das mich seit Jahren heimsucht und jetzt, wo ich es schließlich getestet habe, dachte ich, es könnte sich lohnen, es zu teilen, da ich keine dokumentierte Antwort auf SO finden konnte. Ich bin mir sicher, dass es vielen Leuten Kopfschmerzen bereitet hat, vor allem die Tatsache, dass sich die Reihenfolge ändern kann, wenn man die Szene neu lädt. Wie "es funktionierte, als ich es letzte Nacht schloss, warum funktioniert es heute nicht?" –

+0

Ich würde sagen, wenn Sie Objekt A vor Objekt B benötigen, haben Sie eine Beziehung, so dass Sie sich nicht mehr auf das Unity-Update-System verlassen können und A muss B anrufen. Sie haben es selbst gesagt, das Neuladen kann die Reihenfolge ändern. Wenn Sie also wissen, dass es beim nächsten Mal falsch sein könnte, bedeutet dies, dass wenn Sie sich weiterhin darauf verlassen, dass Unity Update weiß, dass es eines Tages scheitern wird, Sie es tun werden. – Everts

Antwort

3

Ich habe ein kleines Testprojekt in Unity gebaut, das im Grunde aus einem 3x3x3 Baum von GameObjects besteht, jeder mit 3 Skripten.

fand ich folgende Antworten:

  1. Nr kann Einige Gameobjects in Betracht gezogen werden, bevor ihre Eltern sind, während einige Eltern in Betracht gezogen werden können, bevor ihre Kinder sind. Und diese Reihenfolge kann sich ändern, wenn Sie die Szene neu laden oder den Szenengraph manipulieren.
  2. Nein Geschwister können in beliebiger Reihenfolge aktualisiert werden. Diese Reihenfolge kann sich ändern, wenn Sie die Szene neu laden oder den Szenengraph manipulieren.
  3. Es wird über alle GameObjects in der Szene erzwungen. Wenn in SEO festgelegt wird, dass Skript A vor Skript B ausgeführt wird, werden alle Instanzen von Skript A vor jeder Instanz von Skript B berücksichtigt. Das heißt, alle Instanzen von A rufen ihre Awake() an, bevor B ihre Awake() anrufen, dann rufen alle Instanzen von A ihre Start() an, bevor irgendeine Instanz von B ihre Start() und so weiter anruft.
+0

Dies könnte auch von Interesse sein: http://docs.unity3d.com/Manual/class-ScriptExecution.html –