2016-01-26 3 views
5

Ich habe nur eine kleine Erfahrung in Unity3D, aber ich habe festgestellt, dass Klassen, die von MonoBehaviour abgeleitet sind, Funktionen mit vordefinierten Signaturen enthalten können, die auf eine spezielle Weise aufgerufen werden. Zum Beispiel, wenn ich schreibe:Wie führt Unity seine Methoden aus?

void Update() 
{ 
    //some code 
} 

Diese Methode wird jeden Rahmen aufgerufen werden.

Ich stelle mir vor, dass in Unity gibt es eine Art von Endlosschleife, die die Methode Update jedes Bild für jedes Objekt in der Szene aufruft. Aber woher weiß es, dass das Objekt tatsächlich die Methodenimplementierung Update bereitstellt? Es wäre klar gewesen, wenn Update eine Überschreibung für eine Methode in der Klasse MonoBehaviour wäre, aber nach der Syntax (und der Tatsache, dass Sie solche Methoden mit jedem Zugriffsmodifikator implementieren können) ist es nicht. Gibt es dort eine Reflektionsmagie?

+0

die kurze Zeit ist sie verwenden Vorverarbeitung Magie, um diese "Quasi-Funktionen" zu behandeln. Sie können viele Erklärungen googlen. Vergiss nie Game Engines sind Frame-basierte Systeme, es ist alles ein bisschen anders! – Fattie

Antwort

7

http://blogs.unity3d.com/2015/12/23/1k-update-calls/

Nein, Unity verwenden System.Reflection nicht eine magische Methode jedes Zeit ein aufrufen muss zu finden.

Stattdessen wird das erste Mal, wenn ein MonoBehaviour eines bestimmten Typs ist das zugrunde liegende Skript wird durch Scripting Runtime (entweder Mono oder IL2CPP) kontrolliert zugegriffen, ob es irgendwelche magischen Methoden definiert hat und diese Informationen zwischengespeichert wird. Wenn ein MonoBehaviour eine bestimmte Methode hat, wird sie zu einer geeigneten Liste hinzugefügt, zum Beispiel wenn ein Skript die Update-Methode definiert hat, wird es zu einer Liste von Skripten hinzugefügt, die aktualisiert werden müssen jedes Bild.

Während des Spiels durchläuft Unity einfach diese Listen und führt Methoden aus - so einfach. Auch deshalb ist es egal, ob Ihre Update-Methode öffentlich oder privat ist.

+0

Genau das, was ich wollte! Danke vielmals! – bashis

+0

Ich bin froh, dass ich helfen konnte. Prost. BTW dieser Blogartikel hat viel interessantere Informationen. –

+0

Es stellt sich heraus, dass sie tatsächlich eine Art von Reflexion verwenden, nur nicht "System.Reflection". – bashis