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 aGetComponent<Transform>()
, és nem athis.transform
és agameObject.transform
. - Ismét ugyanazt csinálják.