Wat zijn de verschillen tussen het gebruik van GetComponent < Transform > () en this.transform?

Ik “heb wat voorbeeldcode gelezen en aan mijn eigen dingen gewerkt in Unity. Ik” heb veel GetComponent<>(), en vaak wordt dit gedaan voor de transformatie als Transform _transform = GetComponent<Transform>().

Ik heb echter al toegang gehad tot de bijgevoegde game-objecten transformeren, als transform, this.transform of gameObject.transform. Ik begrijp het gebruik van GetComponent() in de meeste gevallen, maar waarom zou je de functie specifiek gebruiken voor GameObject en Transform wanneer de twee items toegankelijk zijn vanuit het script om mee te beginnen?

Reacties

  • Er is geen verschil in het eindresultaat.

Antwoord

De snelheid (snel tot langzaam):

cached _transform >> Component.transform >> Component.GetComponent<Transform> 

En als je een UnityEngine.dll C # binair bestand uit elkaar haalt, kun je zien dat transformatie niet GetComponent (Component class member) aanroept, roep gewoon de interne mono runtime-methode aan. Hier is de transformatiecode.

// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform(); 

En hier is de gedemonteerde GetComponent-methode van de componentklasse.

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 is een soort zoekfunctie die generieke termen gebruikt. Het “is dus een beetje langzamer dan caching.


Oorspronkelijke bron:

public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } } 

Binair gedemonteerd:

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>(); } } 

Antwoord

Als Jinbom zei dat het belangrijkste verschil hier snelheid is.

Het is echter belangrijk op te merken dat dit alleen het geval is voor de transformatie-eigenschap van GameObject. Andere eigenschappen zoals camera en rigidbody zijn slechts gemakseigenschappen en noemen GetComponent <> onder de motorkap, zodat de prestaties identiek zijn. Het is om deze reden dat Unity deze “helper” -eigenschappen in Unity heeft gedeponeerd, aangezien het niet meteen duidelijk is dat Unity naar de component gaat zoeken in plaats van een gecachte versie terug te sturen.

Met uitzondering van de transform-eigenschap genoemd in de vraag, moeten alle andere componenten bij de eerste beschikbare gelegenheid in de cache worden opgeslagen met GetComponent <> en die waarde in de cache moet daarna worden gebruikt.

Antwoord

Op dit moment kun je aannemen dat elk game-object de Transform-component zal hebben vanwege de this.transform -syntaxis. Ik vermoed dat Unity zijn API heeft geüpdatet met de GetComponent<>() -syntaxis zodat je in de toekomst GameObjects zou kunnen hebben zonder “speciale” componenten zoals Transform.

Dan jij kan een “zuiverdere” architectuur hebben waar uw GameObjects “t niet met Transforms moeten komen (hoewel de editor ze standaard nog steeds als een conventie toevoegt).

Reacties

  • Transform is de enige component die op deze manier werkt. Hoe dan ook, ik doe ' Ik denk niet dat vertrouwen in toekomstige speculatie een goed antwoord is. Unity heeft geen enkele suggestie getoond om deze kant op te gaan, en ik twijfel er persoonlijk aan dat ze dat zullen doen (aangezien het hebben van een fysiek object in je spel vereist dat het object informatie bevat die relevant is voor zijn fysieke toestand, zoals positie en grootte ).
  • Dit lijkt ook commentaar te geven op mijn vraag, maar geeft geen antwoord.

Antwoord

De enige reden waarom this.transform überhaupt werkt, is omdat MonoBehavior een gemakseigenschap implementeert voor de Transform-component op het GameObject waaraan het gedrag is gekoppeld. … Het is nogal misleidend. Ik denk dat gameObject.transform semantisch correcter is, maar dat zijn splijtende haren. Ze doen hetzelfde.

Opmerkingen

  • Dit levert niets op voor het beantwoorden van mijn eigenlijke vraag. De enige reden waarom alles werkt, is omdat het is ingesteld op, wat is uw punt? Ik vraag naar het verschil tussen this.transform en GetComponent<Transform>(), niet this.transform en gameObject.transform.
  • Nogmaals, ze doen hetzelfde.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *