Četl jsem nějaký ukázkový kód a pracoval na svých vlastních věcech v Unity. Viděl jsem spoustu GetComponent<>()
a často se to provede pro transformaci jako Transform _transform = GetComponent<Transform>()
.
Už jsem však měl přístup k transformaci připojených herních objektů, jako transform
, this.transform
nebo gameObject.transform
. Rozumím používání GetComponent()
ve většině případů, ale proč byste konkrétně používali funkci pro GameObject
a Transform
když jsou tyto dvě položky ze skriptu pro začátek přístupné?
Komentáře
- V konečném výsledku není rozdíl.
Odpověď
Rychlost (rychle až pomalu):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
A pokud demontujete binární soubor UnityEngine.dll C #, můžete vidět, že transformace nevolá GetComponent (člen třídy Component), stačí zavolat interní metodu mono runtime. Zde je transformační kód.
// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform();
A tady je demontovaná metoda GetComponent třídy Component.
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 je druh vyhledávací funkce využívající generiku. Je tedy o něco pomalejší než ukládání do mezipaměti.
Původní zdroj:
public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } }
Binární demontáž:
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>(); } }
Odpověď
Jako Jinbom uvedl, že hlavním rozdílem je rychlost.
Je však důležité si uvědomit, že toto je pouze případ vlastnosti transformace GameObject. Další vlastnosti, jako je kamera a pevné tělo, jsou pouze vlastnosti pohodlí a volají GetComponent <> pod kapotou, takže výkon je identický. Z tohoto důvodu Unity zastaralo tyto „pomocné“ vlastnosti v Unity, protože není okamžitě zřejmé, že Unity bude hledat komponentu, místo aby vrátil verzi uloženou v mezipaměti.
S výjimkou vlastnost transformace uvedená v otázce, všechny ostatní komponenty by měly být při první dostupné příležitosti uloženy do mezipaměti pomocí GetComponent <> a poté by měla být použita tato hodnota v mezipaměti.
Odpověď
Právě teď můžete předpokládat, že každý herní objekt bude mít komponentu Transformace díky syntaxi this.transform
. Můj odhad je, že Unity aktualizovala své API pomocí syntaxe GetComponent<>()
, takže v budoucnu můžete mít GameObjects bez „speciálních“ komponent, jako je Transformace.
Pak vy může mít „čistší“ architekturu, ve které vaši GameObjects nemají přicházet s transformacemi (i když je editor může standardně přidávat standardně jako konvenci).
Komentáře
-
Transform
je jediná složka, která takto funguje. Bez ohledu na to nedělám ' Myslím si, že spoléhání se na budoucí spekulace je dobrou odpovědí. Jednota neprokázala žádné návrhy směřující k tomuto způsobu pohybu a já osobně pochybuji, že ano (vzhledem k tomu, že máte ve hře fyzický objekt vyžaduje, aby tento objekt obsahoval informace týkající se jeho fyzického stavu, například poloha a velikost ). - Také se zdá, že to komentuje na mou otázku, ale neodpovídá na ni.
Odpovědět
Jediným důvodem, proč vůbec this.transform
funguje, je to, že MonoBehavior implementuje vlastnost pohodlí pro komponentu Transform na GameObject, ke kterému je chování připojeno. … Je to docela zavádějící. Myslím, že gameObject.transform
je sémanticky správnější, ale to je rozdělení vlasů. Dělají totéž.
Komentáře
- To neposkytuje nic k zodpovězení mé skutečné otázky. Jediný důvod, proč cokoli funguje, je ten, že to bylo nastaveno, jaký je váš názor? Ptám se na rozdíl mezi
this.transform
aGetComponent<Transform>()
, nethis.transform
agameObject.transform
. - Znovu dělají totéž.