Vilka är skillnaderna mellan att använda GetComponent < Transformera > () och this.transform?

Jag har läst någon exempelkod och arbetat med mina egna saker i Unity. Jag har sett mycket GetComponent<>(), och ofta kommer detta att göras för omvandlingen som Transform _transform = GetComponent<Transform>().

Jag har emellertid redan haft tillgång till de bifogade spelobjekten omvandlas, som transform, this.transform eller gameObject.transform. Jag kan förstå att använda GetComponent() i de flesta fall, men varför skulle du specifikt använda funktionen för GameObject och Transform när de två artiklarna är tillgängliga från skriptet till att börja med?

Kommentarer

  • Det finns ingen skillnad i slutresultatet.

Svar

Hastigheten (snabb till långsam):

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

Och om du tar isär en UnityEngine.dll C # binär, kan du se transformera ring inte GetComponent (komponent klassmedlem), bara ring intern mono runtime-metod. Här är transformeringskoden.

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

Och här är demonterad komponentklass s GetComponent-metod.

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 är en typ av funktionsfunktion med generik. Så det är lite långsammare än cachning.


Originalkälla:

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

Binär demonterad:

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 att den största skillnaden här är hastighet.

Det är dock viktigt att notera att detta bara är fallet för transform-egenskapen hos GameObject. Andra egenskaper som kamera och styvkropp är bara bekvämlighetsegenskaper och kallar GetComponent <> under huven så att prestandan blir identisk. Det är av den anledningen som Unity har avskaffat dessa ”hjälpar” -egenskaper i Unity, eftersom det inte är direkt uppenbart att Unity ska söka efter komponenten istället för att returnera en cachad version.

Med undantag för transformera egenskapen som nämns i frågan, bör alla andra komponenter cachas vid den första tillgängliga möjligheten med hjälp av GetComponent <> och det cachade värdet bör användas därefter.

Svar

Just nu kan du anta att varje spelobjekt kommer att ha Transform-komponenten på grund av this.transform syntax. Min gissning är att Unity uppdaterade sitt API med GetComponent<>() syntax var så att du i framtiden kunde ha GameObjects utan ”speciella” komponenter som Transform.

Då kan ha en ”renare” arkitektur där dina GameObjects inte måste komma med Transforms (även om redaktören fortfarande kan lägga till dem som standard).

Kommentarer

  • Transform är den enda komponenten som agerar på detta sätt. Oavsett, jag don ' tänka att beroende av framtida spekulationer ger ett bra svar. Enhet har inte visat något förslag på att gå på det här sättet, och jag är personligen tvivelaktig om de kommer att göra (med tanke på att ha ett fysiskt objekt i ditt spel kräver att det objektet innehåller information som är relevant för dess fysiska tillstånd, såsom position och storlek ).
  • Detta verkar också kommentera på min fråga, men svarar inte på den.

Svar

Den enda anledningen till att this.transform fungerar alls är att MonoBehavior implementerar en bekvämlighetsegenskap för Transform-komponenten på GameObject som beteendet är kopplat till. … Det är ganska vilseledande. Jag tycker att gameObject.transform är mer semantiskt korrekt, men det klyver hår. De gör samma sak.

Kommentarer

  • Detta ger inget mot att svara på min faktiska fråga. Den enda anledningen till att någonting fungerar är att det var inställt på, vad är din poäng? Jag frågar om skillnaden mellan this.transform och GetComponent<Transform>(), inte this.transform och gameObject.transform.
  • Återigen gör de samma sak.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *