Mi a különbség a GetComponent < Transform > () és ez.transzform használata között?

Olvastam néhány példakódot, és a saját dolgain dolgoztam a Unity-ben. Nagyon sok , és ez gyakran megtörténik az átalakításhoz Transform _transform = GetComponent<Transform>() néven.

Viszont már hozzáférhettem a csatolt játékobjektumok átalakításához, mint transform, this.transform vagy gameObject.transform. Meg tudom érteni a GetComponent() használatát a legtöbb esetben, de miért használja a GameObject és a Transform amikor a két elem a kezdetektől elérhető a szkriptből?

Megjegyzések

  • Nincs különbség a végeredményben.

Válasz

A sebesség (gyorsan lassul):

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

És ha szétszed egy UnityEngine.dll C # bináris fájlt, láthatja, hogy a transzformáció nem hívja meg a GetComponent (Component osztálytag), csak hívja meg a belső mono futásidejű módszert. Itt van az átalakítási kód.

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

És itt van szétszerelve a Komponens osztály GetComponent metódusa.

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

A GetComponent egyfajta keresési funkció az általános módszerekkel. Tehát kicsit lassabb, mint a gyorsítótár.


Eredeti forrás:

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

Bináris szétszerelve:

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

Válasz

As Jinbom szerint a fő különbség itt a sebesség.

Fontos azonban megjegyezni, hogy ez csak a GameObject transzformációs tulajdonságára vonatkozik. Más tulajdonságok, például a kamera és a merev test csak kényelmi tulajdonságok, és a motorháztető alá hívják a GetComponent <> -t, így a teljesítmény azonos. Éppen ezért az Unity megfosztotta ezeket a “segítő” tulajdonságokat a Unity-ben, mivel nem azonnal nyilvánvaló, hogy a Unity az összetevőt fogja keresni ahelyett, hogy egy gyorsítótárazott verziót adna vissza.

A transzformálja a kérdésben említett tulajdonságot, az összes többi összetevőt az első elérhető lehetőségnél a GetComponent <> használatával gyorsítótárba kell helyezni, és ezt követően a gyorsítótárazott értéket kell használni.

Válasz

Jelenleg feltételezhetjük, hogy minden játékobjektumban lesz a Transform komponens a this.transform szintaxis miatt. Azt hiszem, hogy a Unity frissítette API-ját a GetComponent<>() szintaxissal, hogy a jövőben “speciális” komponensek, például a Transform nélkül rendelkezhessenek GameObjects-el.

Akkor “tisztább” architektúrájú lehet, ahol a GameObjects-nek nem kell jönnie a Transforms-szal (bár a szerkesztő alapértelmezés szerint még mindig hozzáadhatja őket konvencióként).

Megjegyzések

  • Transform az egyetlen ilyen módon működő összetevő. Ettől függetlenül nem ' nem gondolja, hogy a jövõbeli spekulációkra való támaszkodás jó választ ad. Az egység nem mutatott javaslatot az ilyen irányú továbblépésre, és személy szerint kétlem, hogy megteszik-e (tekintettel arra, hogy a játékban van fizikai tárgy megköveteli, hogy az objektum fizikai állapotához kapcsolódó információkat tartalmazzon, például pozíció és méret ).
  • Ez úgy tűnik, hogy megjegyzést is fűz hozzá kérdésemre, de nem válaszol rá.

Válasz

A this.transform egyetlen oka annak, hogy egyáltalán működik, az az, hogy a MonoBehavior kényelmi tulajdonságot valósít meg a Transform összetevőhöz a GameObject-en, amelyhez a viselkedés kapcsolódik. … Ez meglehetősen félrevezető. Szerintem az gameObject.transform szemantikailag helyesebb, de ez a szőrszálakat hasítja. Ugyanezt teszik.

Megjegyzések

  • Ez nem nyújt semmit a tényleges kérdésem megválaszolása szempontjából. Az egyetlen ok, amiért bármi működik, az az, hogy beállították, mi a véleményed? A this.transform és a GetComponent<Transform>(), és nem a this.transform és a gameObject.transform.
  • Ismét ugyanazt csinálják.

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük