Mitä eroja on GetComponent < Transform > (): n ja tämän.muunnoksen välillä?

Olen lukenut esimerkkikoodia ja työskennellyt omien juttujen parissa Unityssä. Olen nähnyt paljon GetComponent<>(), ja usein tämä tehdään muunnokselle nimellä Transform _transform = GetComponent<Transform>().

Minulla on kuitenkin jo pääsy liitettyihin peliobjektien muunnoksiin, kuten transform, this.transform tai gameObject.transform. Ymmärrän GetComponent() -sovelluksen käyttämisen useimmissa tapauksissa, mutta miksi käyttäisit nimenomaisesti funktiota GameObject ja Transform kun nämä kaksi kohdetta ovat käytettävissä komentosarjan alussa?

Kommentit

  • Lopputuloksessa ei ole eroa.

vastaus

Nopeus (nopeasti hidastuva):

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

Ja jos purat UnityEngine.dll C # -binaarin, näet, että muunnos ei soita GetComponentille (Component-luokan jäsen), vaan kutsu vain sisäinen mono-ajonaikainen menetelmä. Tässä on muunnoskoodi.

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

Ja tässä on purettu komponenttiluokan GetComponent-menetelmä.

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 on eräänlainen hakutoiminto, joka käyttää geneerisiä aineita. Joten se on vähän hitaampi kuin välimuisti.


Alkuperäinen lähde:

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

Binaarinen purettu:

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

vastaus

Kuten Jinbom sanoi, että tärkein ero tässä on nopeus.

On kuitenkin tärkeää huomata, että tämä pätee vain GameObjectin muunnosominaisuuteen. Muut ominaisuudet, kuten kamera ja jäykkä runko, ovat vain mukavuusominaisuuksia ja kutsuvat GetComponent <> konepellin alle, joten suorituskyky on identtinen. Tästä syystä Unity on menettänyt nämä ”auttajan” ominaisuudet Unityssä, koska ei ole heti selvää, että Unity aikoo etsiä komponenttia sen sijaan, että palauttaisi välimuistissa olevan version.

Lukuun ottamatta Jos kysymyksessä mainittu ominaisuus muunnetaan, kaikki muut komponentit tulisi tallentaa välimuistiin heti, kun käytettävissä on tilaisuus GetComponent <> -ominaisuuden avulla, ja välimuistissa olevaa arvoa tulisi käyttää sen jälkeen.

Vastaa

Voit nyt olettaa, että jokaisella peliobjektilla on Transform-komponentti this.transform -syntaksin vuoksi. Oletan, että Unity päivitti sovellusliittymänsä GetComponent<>() -syntaksilla, jotta tulevaisuudessa sinulla voisi olla GameObjects ilman erityisiä komponentteja, kuten Transform.

Sitten sinä sillä voi olla ”puhtaampi” arkkitehtuuri, jossa GameObjectisi ei mukana Transforms-tiedostoja (vaikka editori saattaa silti lisätä ne oletuksena sopimukseksi).

Kommentit

  • Transform on ainoa tällä tavoin toimiva komponentti. Siitä huolimatta en ' usko, että luottaminen tuleviin keinotteluihin antaa hyvän vastauksen. Yhtenäisyys ei ole osoittanut ehdotusta tämänsuuntaisen liikkumisen puolesta, ja minä henkilökohtaisesti epäilen, että he aikovat tehdä (kun otetaan huomioon, että fyysisellä esineellä on peliäsi vaatii objektin sisältämään fyysiseen tilaansa liittyviä tietoja, kuten sijainti ja koko ).
  • Tämä näyttää myös kommentoivan kysymykseeni, mutta ei vastaa siihen.

Vastaa

Ainoa syy, miksi this.transform toimii ollenkaan, johtuu siitä, että MonoBehavior toteuttaa Transform-komponentin mukavuusominaisuuden GameObjectissa, johon käyttäytyminen on liitetty. … Se on melko harhaanjohtava. Luulen, että gameObject.transform on semanttisesti oikea, mutta se jakaa karvat. He tekevät saman asian.

Kommentit

  • Tämä ei anna mitään vastausta varsinaiseen kysymykseeni. Ainoa syy, miksi kaikki toimii, on se, että se on perustettu, mikä on mielesi? Kysyn eroa this.transform ja GetComponent<Transform>(), ei this.transform ja gameObject.transform.
  • Jälleen he tekevät saman.

Vastaa

Sähköpostiosoitettasi ei julkaista. Pakolliset kentät on merkitty *