Care sunt diferențele dintre utilizarea GetComponent < Transform > () și this.transform?

Am citit un exemplu de cod și am lucrat la propriile lucruri în Unity. Am văzut o mulțime de GetComponent<>() și adesea acest lucru se va face pentru transformare ca Transform _transform = GetComponent<Transform>().

Cu toate acestea, am avut deja acces la transformarea obiectelor de joc atașate, ca transform, this.transform sau gameObject.transform. Înțeleg să folosesc GetComponent() în majoritatea cazurilor, dar de ce ați folosi în mod special funcția pentru GameObject și Transform când cele două elemente sunt accesibile din script pentru a începe?

Comentarii

  • Nu există nicio diferență în rezultatul final.

Răspuns

Viteza (rapid la lent):

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

Și dacă dezasamblați un binar UnityEngine.dll C #, puteți vedea transformarea nu apelați GetComponent (membru al clasei Component), trebuie doar să apelați metoda internă de runtime mono. Iată codul de transformare.

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

Și Iată metoda GetComponent a clasei de componente dezasamblate.

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 este un fel de funcție de căutare care utilizează generice. Deci, este „puțin mai lent decât stocarea în cache.


Sursa originală:

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

Binar dezasamblat:

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

Răspuns

Ca Jinbom a spus că principala diferență aici este viteza.

Cu toate acestea, este important să rețineți că acest lucru este valabil doar pentru proprietatea de transformare a GameObject. Alte proprietăți, cum ar fi camera foto și camera rigidă, sunt doar proprietăți de comoditate și apelează GetComponent <> sub capotă, astfel încât performanța să fie identică. Din acest motiv, Unity a respins aceste proprietăți de „ajutor” în Unity, deoarece nu este evident că Unity va căuta componenta în loc să returneze o versiune cache.

Cu excepția transformă proprietatea menționată în întrebare, toate celelalte componente ar trebui să fie memorate în cache la prima oportunitate disponibilă utilizând GetComponent <> și acea valoare cache ar trebui utilizată ulterior.

Răspuns

În acest moment puteți presupune că fiecare obiect de joc va avea componenta Transformare datorită sintaxei this.transform. Cred că Unity și-a actualizat API-ul cu sintaxa GetComponent<>() astfel încât în viitor să poți avea GameObjects fără componente „speciale” precum Transform.

poate avea o arhitectură „mai pură” în care GameObjects dvs. nu trebuie să vină cu Transforms (deși editorul le-ar putea adăuga în mod implicit ca o convenție).

Comentarii

  • Transform este singura componentă care acționează în acest fel. Indiferent, eu nu ' Nu cred că dependența de speculațiile viitoare oferă un răspuns bun. Unitatea nu a arătat nicio sugestie pentru a se deplasa în acest mod și personal sunt îndoielnic că vor face acest lucru (dat fiind faptul că aveți un obiect fizic în jocul dvs. necesită acel obiect să conțină informații relevante pentru starea sa fizică, cum ar fi poziția și dimensiunea ).
  • De asemenea, acest lucru pare să comenteze la întrebarea mea, dar nu răspunde la ea.

Răspunde

Singurul motiv pentru care this.transform funcționează este că MonoBehavior implementează o proprietate de comoditate pentru componenta Transform pe GameObject la care este atașat comportamentul. … Este destul de înșelător. Cred că gameObject.transform este mult mai corect din punct de vedere semantic, dar asta împarte firele de păr. Ei fac același lucru.

Comentarii

  • Acest lucru nu oferă nimic pentru a răspunde la întrebarea mea reală. Singurul motiv pentru care ceva funcționează este pentru că a fost creat, care este punctul tău? Întreb despre diferența dintre this.transform și GetComponent<Transform>(), nu this.transform și gameObject.transform.
  • Din nou, fac același lucru.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *