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
ogGetComponent<Transform>()
, ikkethis.transform
oggameObject.transform
. - Igen gør de det samme.