Jeg har lest noen eksempler på kode og jobbet med mine egne ting i Unity. Jeg har sett mye GetComponent<>()
, og ofte vil dette gjøres for transformasjonen som Transform _transform = GetComponent<Transform>()
.
Imidlertid har jeg allerede hatt tilgang til vedlagte spillobjekter transformerer, som transform
, this.transform
eller gameObject.transform
. Jeg kan forstå det å bruke GetComponent()
i de fleste tilfeller, men hvorfor vil du spesifikt bruke funksjonen til GameObject
og Transform
når de to elementene er tilgjengelige fra skriptet til å begynne med?
Kommentarer
- Det er ikke forskjell i sluttresultatet.
Svar
Hastigheten (rask til sakte):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
Og hvis du demonterer en UnityEngine.dll C # binær, kan du se transform ikke ring GetComponent (komponent klassemedlem), bare ring intern mono runtime metode. Her er transformasjonskoden.
// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform();
Og her er demontert komponentklasse s 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 Finding-funksjon ved hjelp av generikk. Så det er litt tregere enn caching.
Originalkilde:
public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } }
Binær demontert:
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 sa at hovedforskjellen her er hastighet.
Det er imidlertid viktig å merke seg at dette bare er tilfelle for transformasjonsegenskapen til GameObject. Andre egenskaper som kamera og stiv kropp er bare bekvemmelighetsegenskaper og kaller GetComponent <> under panseret slik at ytelsen blir identisk. Det er av denne grunn at Unity har fratatt seg disse «hjelper» -egenskapene i Unity, da det ikke umiddelbart er åpenbart at Unity skal søke etter komponenten i stedet for å returnere en hurtigbufret versjon.
Med unntak av transformere egenskapen som er nevnt i spørsmålet, bør alle andre komponenter bufres ved første tilgjengelige mulighet ved hjelp av GetComponent <>, og den bufrede verdien skal brukes deretter.
Svar
Akkurat nå kan du anta at hvert spillobjekt vil ha Transform-komponenten på grunn av this.transform
syntaksen. Jeg antar at Unity oppdaterte API-en med GetComponent<>()
syntaksen var slik at du i fremtiden kunne ha GameObjects uten «spesielle» komponenter som Transform.
Så du kan ha en «renere» arkitektur der GameObjects ikke må komme med Transforms (selv om redaktøren fremdeles kan legge dem til som standard).
Kommentarer
-
Transform
er den eneste komponenten som fungerer på denne måten. Uansett gjør jeg ikke ' ikke tror avhengighet av fremtidig spekulasjon gir et godt svar. Enhet har ikke vist noe forslag til å bevege seg på denne måten, og jeg er personlig tvilende til at de vil (gitt at det å ha et fysisk objekt i spillet ditt krever at objektet inneholder informasjon som er relevant for dets fysiske tilstand, for eksempel posisjon og størrelse ). - Også dette ser ut til å kommentere på spørsmålet mitt, men svarer ikke på det.
Svar
Den eneste grunnen til at this.transform
i det hele tatt fungerer, er fordi MonoBehavior implementerer en praktisk egenskap for Transform-komponenten på GameObject atferden er knyttet til. … Det er ganske misvisende. Jeg tror gameObject.transform
er mer semantisk korrekt, men det er å splitte hår. De gjør det samme.
Kommentarer
- Dette gir ingenting mot å svare på det faktiske spørsmålet mitt. Den eneste grunnen til at noe fungerer, er fordi den ble satt opp til, hva er poenget ditt? Jeg spør om forskjellen mellom
this.transform
ogGetComponent<Transform>()
, ikkethis.transform
oggameObject.transform
. - Igjen gjør de det samme.