Hvad er forskellen mellem at bruge GetComponent < Transform > () og this.transform?

Jeg har læst nogle eksempler på kode og arbejdet med mine egne ting i Unity. Jeg har set en masse GetComponent<>(), og ofte vil dette gøres for transformeringen som Transform _transform = GetComponent<Transform>().

Jeg har dog allerede haft adgang til de vedhæftede spilobjekter transformerer, som transform, this.transform eller gameObject.transform. Jeg kan forstå ved at bruge GetComponent() i de fleste tilfælde, men hvorfor skulle du specifikt bruge funktionen til GameObject og Transform når de to elementer er tilgængelige fra scriptet til at begynde med?

Kommentarer

  • Der er ikke forskel i slutresultatet.

Svar

Hastigheden (hurtig til langsom):

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

Og hvis du adskiller en UnityEngine.dll C #-binær, kan du se, at transform ikke kalder GetComponent (komponentklassemedlem), bare ring til den interne mono-runtime-metode. Her er transformationskoden.

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

Og her adskilles komponentklassens GetComponent-metode.

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 er en slags Find-funktion ved hjælp af generics. Så det er lidt langsommere end cache.


Original kilde:

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

Binær adskilt:

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

Svar

Som Jinbom sagde, at den største forskel her er hastighed.

Det er dog vigtigt at bemærke, at dette kun er tilfældet for transformeringsegenskaben i GameObject. Andre egenskaber som kamera og stiftlegeme er bare bekvemmelighedsegenskaber og kalder GetComponent <> under emhætten, så ydeevnen er identisk. Det er af denne grund, at Unity har frataget disse “hjælper” -egenskaber i Unity, da det ikke umiddelbart er indlysende, at Unity vil søge efter komponenten i stedet for at returnere en cachelagret version.

Med undtagelse af transformere egenskab nævnt i spørgsmålet, skal alle andre komponenter caches ved den første tilgængelige mulighed ved hjælp af GetComponent <>, og den cachelagrede værdi skal bruges derefter.

Svar

Lige nu kan du antage, at hvert spilobjekt har Transform-komponenten på grund af this.transform syntaksen. Mit gæt er, at Unity opdaterede sin API med GetComponent<>() syntaksen var, så du i fremtiden kunne have GameObjects uden “specielle” komponenter som Transform.

Så skal du kan have en “renere” arkitektur, hvor dine GameObjects ikke skal have med Transforms (selvom redaktøren muligvis stadig tilføjer dem som standard).

Kommentarer

  • Transform er den eneste komponent, der fungerer på denne måde. Uanset hvad jeg ikke ' t tror, at tillid til fremtidig spekulation giver et godt svar. Enhed har ikke vist noget forslag til at bevæge sig på denne måde, og jeg er personligt tvivlsom om de vil (i betragtning af at have et fysisk objekt i dit spil kræver, at objektet indeholder oplysninger, der er relevante for dets fysiske tilstand, såsom position og størrelse ).
  • Dette ser også ud til at kommentere på mit spørgsmål, men besvarer det ikke.

Svar

Den eneste grund til, at this.transform overhovedet virker, er fordi MonoBehavior implementerer en bekvemhedsegenskab til Transform-komponenten på GameObject, som adfærden er knyttet til. … Det er ret vildledende. Jeg synes gameObject.transform er mere semantisk korrekt, men det er at splitte hår. De gør det samme.

Kommentarer

  • Dette giver intet i retning af at besvare mit aktuelle spørgsmål. Den eneste grund til, at noget fungerer, er, fordi det var sat op til, hvad er dit pointe? Jeg spørger om forskellen mellem this.transform og GetComponent<Transform>(), ikke this.transform og gameObject.transform.
  • Igen gør de det samme.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *