Jai lu un exemple de code et travaillé sur mes propres éléments dans Unity. Jai vu beaucoup de GetComponent<>()
, et cela sera souvent fait pour la transformation en tant que Transform _transform = GetComponent<Transform>()
.
Cependant, jai déjà eu accès à la transformation des objets de jeu attachés, comme transform
, this.transform
ou gameObject.transform
. Je peux comprendre lutilisation de GetComponent()
dans la plupart des cas, mais pourquoi utiliseriez-vous spécifiquement la fonction pour GameObject
et Transform
quand les deux éléments sont accessibles depuis le script pour commencer?
Commentaires
- Il ny a pas de différence dans le résultat final.
Réponse
La vitesse (rapide à lent):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
Et si vous démontez un binaire C # UnityEngine.dll, vous pouvez voir que la transformation nappelle pas GetComponent (membre de la classe Component), appelez simplement la méthode dexécution mono interne. Voici le code de transformation.
// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform();
Et voici la méthode GetComponent de la classe Component démontée.
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 est une sorte de fonction de recherche utilisant des génériques. Cest donc un peu plus lent que la mise en cache.
Source dorigine:
public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } }
Binaire désassemblé:
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>(); } }
Réponse
Comme Jinbom a dit que la principale différence ici est la vitesse.
Cependant, il est important de noter que ce nest le cas que pour la propriété transform de GameObject. Dautres propriétés telles que la caméra et le corps rigide ne sont que des propriétés de commodité et appellent GetComponent <> sous le capot pour que les performances soient identiques. Cest pour cette raison que Unity a supprimé ces propriétés « dassistance » dans Unity car il nest pas immédiatement évident que Unity va rechercher le composant plutôt que de renvoyer une version mise en cache.
À lexception du transform mentionnée dans la question, tous les autres composants doivent être mis en cache à la première opportunité disponible à laide de GetComponent <> et cette valeur mise en cache doit être utilisée par la suite.
Réponse
Pour le moment, vous pouvez supposer que chaque objet de jeu aura le composant Transform grâce à la syntaxe this.transform
. Je suppose que Unity a mis à jour son API avec la syntaxe GetComponent<>()
afin quà lavenir vous puissiez avoir GameObjects sans composants « spéciaux » comme Transform.
Ensuite, vous peut avoir une architecture « plus pure » où vos GameObjects ne doivent pas être à venir avec les Transforms (bien que léditeur puisse toujours les ajouter par défaut comme convention).
Commentaires
-
Transform
est le seul composant qui agit de cette façon. Quoi quil en soit, je ne ' Je ne pense pas que le fait de se fier à de futures spéculations constitue une bonne réponse. Unity na montré aucune suggestion pour aller dans ce sens, et je doute personnellement que ce soit le cas (étant donné que le fait davoir un objet physique dans votre jeu nécessite que cet objet contienne des informations relatives à son état physique, telles que position et taille ). - Cela semble également commenter sur ma question, mais ny répond pas.
Réponse
La seule raison pour laquelle this.transform
fonctionne du tout est que MonoBehavior implémente une propriété de commodité pour le composant Transform sur le GameObject auquel le comportement est associé. … Cest plutôt trompeur. Je pense que gameObject.transform
est plus sémantiquement correct, mais cest fendre les cheveux. Ils font la même chose.
Commentaires
- Cela napporte rien pour répondre à ma question. La seule raison pour laquelle quelque chose fonctionne, cest parce quil a été configuré pour, quel est votre point? Je demande la différence entre
this.transform
etGetComponent<Transform>()
, et nonthis.transform
etgameObject.transform
. - Encore une fois, ils font la même chose.