Quali sono le differenze tra lutilizzo di GetComponent < Transform > () e this.transform?

Ho letto del codice di esempio e ho lavorato su un mio materiale in Unity. Ho visto molti GetComponent<>(), e spesso questo verrà fatto per la trasformazione come Transform _transform = GetComponent<Transform>().

Tuttavia, ho già avuto accesso alla trasformazione degli oggetti di gioco collegata, come transform, this.transform o gameObject.transform. Capisco lutilizzo di GetComponent() nella maggior parte dei casi, ma perché dovresti utilizzare specificamente la funzione per GameObject e Transform quando i due elementi sono accessibili dallo script per iniziare?

Commenti

  • Non cè differenza nel risultato finale.

Risposta

La velocità (da veloce a lenta):

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

E se disassembli un binario UnityEngine.dll C #, puoi vedere transform non chiamare GetComponent (membro della classe Component), chiama semplicemente il metodo di runtime mono interno. Ecco il codice di trasformazione.

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

Ed ecco il metodo GetComponent della classe Component “s disassemblato.

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 è una sorta di funzione di ricerca che utilizza generici. Quindi “è un po più lenta della memorizzazione nella cache.


Fonte originale:

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

Binario disassemblato:

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

Risposta

As Jinbom ha detto che la differenza principale qui è la velocità.

Tuttavia è importante notare che questo è solo il caso della proprietà di trasformazione di GameObject. Altre proprietà come fotocamera e corpo rigido sono solo proprietà di comodità e chiamano GetComponent <> sotto il cofano in modo che le prestazioni siano identiche. È per questo motivo che Unity ha depredato queste proprietà “helper” in Unity poiché non è immediatamente ovvio che Unity cercherà il componente invece di restituire una versione memorizzata nella cache.

Con leccezione del trasformare la proprietà menzionata nella domanda, tutti gli altri componenti devono essere memorizzati nella cache alla prima opportunità disponibile utilizzando GetComponent <> e il valore memorizzato nella cache deve essere utilizzato in seguito.

Risposta

In questo momento puoi presumere che ogni oggetto di gioco avrà il componente Trasformazione a causa della sintassi this.transform. La mia ipotesi è che Unity abbia aggiornato la sua API con la sintassi GetComponent<>() in modo che in futuro potresti avere GameObjects senza componenti “speciali” come Transform.

Quindi tu può avere unarchitettura “più pura” dove i tuoi GameObjects non devono venire con le trasformazioni (sebbene leditor potrebbe comunque aggiungerli per impostazione predefinita come convenzione).

Commenti

  • Transform è lunico componente che agisce in questo modo. Indipendentemente da ciò, non ' Non credo che fare affidamento su speculazioni future sia una buona risposta. Unity non ha mostrato alcun suggerimento per muoversi in questo modo, e personalmente dubito che lo faranno (dato che avere un oggetto fisico nel tuo gioco richiede che loggetto contenga informazioni pertinenti al suo stato fisico, come posizione e dimensione ).
  • Inoltre, questo sembra commentare sulla mia domanda, ma non risponde.

Rispondi

Lunico motivo per cui this.transform funziona è perché MonoBehavior implementa una proprietà di convenienza per il componente Transform sul GameObject a cui è associato il comportamento. … È piuttosto fuorviante. Penso che gameObject.transform sia semanticamente più corretto, ma questo è un problema. Fanno la stessa cosa.

Commenti

  • Questo non fornisce nulla per rispondere alla mia vera domanda. Lunico motivo per cui qualcosa funziona è perché è stato impostato, qual è il tuo punto? Sto chiedendo la differenza tra this.transform e GetComponent<Transform>(), non this.transform e gameObject.transform.
  • Di nuovo, fanno la stessa cosa.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *