Ich habe einen Beispielcode gelesen und an meinen eigenen Sachen in Unity gearbeitet. Ich habe viele , und dies wird häufig für die Transformation als Transform _transform = GetComponent<Transform>()
durchgeführt.
Ich hatte jedoch bereits Zugriff auf die Transformation der angehängten Spielobjekte. als transform
, this.transform
oder gameObject.transform
. Ich kann die Verwendung von GetComponent()
in den meisten Fällen verstehen, aber warum sollten Sie die Funktion speziell für GameObject
und Transform
Wenn auf die beiden Elemente zunächst über das Skript zugegriffen werden kann?
Kommentare
- Es gibt keinen Unterschied im Endergebnis.
Antwort
Die Geschwindigkeit (schnell bis langsam):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
Und wenn Sie eine C # -Binärdatei von UnityEngine.dll zerlegen, sehen Sie, dass die Transformation GetComponent (Mitglied der Komponentenklasse) nicht aufruft, sondern nur die interne Mono-Laufzeitmethode aufruft. Hier ist der Transformationscode.
// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform();
Und hier ist die GetComponent-Methode der Komponentenklasse.
public extern Component GetComponent(Type type); public T GetComponent<T>() where T : Component { return this.GetComponent(typeof(T)) as T; } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] public extern Component[] GetComponents(Type type);
GetComponent ist eine Art Suchfunktion, die Generika verwendet. Sie ist also „etwas langsamer als das Caching.
Originalquelle:
public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } }
Binär zerlegt:
public class Test : MonoBehaviour { private Transform _transform; private void Start() { // == UnityEngine.Component::get_transform() this._transform = base.get_transform(); // == UnityEngine.Component::GetComponent<UnityEngine.Transform>() this._transform = base.get_gameObject().GetComponent<Transform>(); } }
Antwort
As Jinbom sagte, der Hauptunterschied sei 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 praktische Eigenschaften 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 nicht sofort ersichtlich ist, dass Unity nach der Komponente suchen wird, anstatt eine zwischengespeicherte Version zurückzugeben.
Mit Ausnahme von In 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.
Antwort
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 der Syntax GetComponent<>()
aktualisiert hat, sodass Sie in Zukunft GameObjects ohne „spezielle“ Komponenten wie Transform haben können.
Dann Sie kann eine „reinere“ Architektur haben, in der Ihre GameObjects nicht mit Transforms geliefert werden müssen (obwohl der Editor sie standardmäßig weiterhin als Konvention hinzufügt).
Kommentare
-
Transform
ist die einzige Komponente, die sich so verhält. Unabhängig davon habe ich ' Ich glaube nicht, dass das Vertrauen in zukünftige Spekulationen eine gute Antwort ist. Die Einheit hat keinen Vorschlag gezeigt, sich in diese Richtung zu bewegen, und ich persönlich bin mir nicht sicher, ob dies der Fall ist (angesichts der Tatsache, dass Sie ein physisches Objekt in Ihrem Spiel haben erfordert, dass dieses Objekt Informationen enthält, die für seinen physischen Zustand relevant sind, wie z. B. Position und Größe ). - Dies scheint auch zu kommentieren auf meine Frage, beantwortet sie aber nicht.
Antwort
Der einzige Grund, warum this.transform
überhaupt 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, gameObject.transform
ist semantisch korrekter, aber das spaltet die Haare. Sie tun dasselbe.
Kommentare
- Dies bietet nichts zur Beantwortung meiner eigentlichen Frage. Der einzige Grund, warum irgendetwas funktioniert, ist, dass es eingerichtet wurde. Was ist Ihr Punkt? Ich frage nach dem Unterschied zwischen
this.transform
undGetComponent<Transform>()
, nichtthis.transform
undgameObject.transform
. - Wiederum machen sie dasselbe.