Ich habe einen Beispielcode gelesen und an meinen eigenen Sachen in Unity gearbeitet. Ich habe viel gesehen GetComponent<>()
, und oft wird dies für die Transformation als getan Transform _transform = GetComponent<Transform>()
.
Ich hatte jedoch bereits Zugriff auf die angehängten Spielobjekte transform, as transform
, this.transform
or gameObject.transform
. Ich kann die Verwendung GetComponent()
in den meisten Fällen verstehen , aber warum sollten Sie die Funktion speziell für GameObject
und verwenden, Transform
wenn die beiden Elemente zunächst über das Skript zugänglich sind?
Antworten:
Die Geschwindigkeit (schnell bis langsam):
Und wenn Sie eine UnityEngine.dll C # -Binärdatei zerlegen, sehen Sie, dass transform GetComponent (Mitglied der Komponentenklasse) nicht aufruft, sondern nur die interne Mono-Laufzeitmethode aufruft. Hier ist der Transformationscode.
Und hier ist die GetComponent-Methode der zerlegten Komponentenklasse.
GetComponent ist eine Art Suchfunktion, die Generika verwendet. Es ist also etwas langsamer als das Caching.
Originalquelle :
Binär zerlegt:
quelle
Wie Jinbom sagte, ist der Hauptunterschied hier die Geschwindigkeit.
Es ist jedoch wichtig zu beachten, dass dies nur für die Transformationseigenschaft von GameObject der Fall ist. Andere Eigenschaften wie Kamera und Starrkörper sind nur Komfortmerkmale und rufen GetComponent <> unter der Haube auf, damit die Leistung identisch ist. Aus diesem Grund hat Unity diese "Helfer" -Eigenschaften in Unity beeinträchtigt, da es nicht sofort offensichtlich ist, dass Unity nach der Komponente suchen wird, anstatt eine zwischengespeicherte Version zurückzugeben.
Mit Ausnahme der in der Frage erwähnten Transformationseigenschaft sollten alle anderen Komponenten bei der ersten verfügbaren Opportunity mit GetComponent <> zwischengespeichert werden, und dieser zwischengespeicherte Wert sollte danach verwendet werden.
quelle
Im Moment können Sie davon ausgehen, dass jedes Spielobjekt aufgrund der
this.transform
Syntax die Transform-Komponente hat . Ich vermute, dass Unity seine API mit derGetComponent<>()
Syntax aktualisiert hat, sodass Sie in Zukunft GameObjects ohne "spezielle" Komponenten wie Transform haben können.Dann können Sie eine „reinere“ Architektur haben , wo Ihr Gameobjects nicht haben zu kommen mit Wandelt (obwohl der Editor noch sie standardmäßig als Konvention könnte hinzufügen).
quelle
Transform
ist die einzige Komponente, die sich so verhält. Unabhängig davon denke ich nicht, dass das Vertrauen in zukünftige Spekulationen eine gute Antwort ist. Unity hat keinen Vorschlag gemacht, sich auf diese Weise zu bewegen, und ich persönlich bezweifle, dass dies der Fall sein wird (da für ein physisches Objekt in Ihrem Spiel erforderlich ist, dass dieses Objekt Informationen enthält, die für seinen physischen Zustand relevant sind, wie z. B. Position und Größe ).Der einzige Grund, warum dies überhaupt
this.transform
funktioniert, ist, dass MonoBehavior eine Convenience-Eigenschaft für die Transform-Komponente in dem GameObject implementiert, an das das Verhalten angehängt ist. ... Es ist ziemlich irreführend. Ich denke, dasgameObject.transform
ist semantisch korrekter, aber das spaltet die Haare. Sie machen das Gleiche.quelle
this.transform
undGetComponent<Transform>()
, nichtthis.transform
undgameObject.transform
.