Estive lendo alguns códigos de exemplo e trabalhando em minhas próprias coisas no Unity. Tenho visto muitos GetComponent<>()
, e geralmente isso será feito para a transformação como Transform _transform = GetComponent<Transform>()
.
No entanto, já tive acesso à transformação de objetos de jogo anexados, como transform
, this.transform
ou gameObject.transform
. Posso entender o uso de GetComponent()
na maioria dos casos, mas por que você usaria especificamente a função para GameObject
e Transform
quando os dois itens estão acessíveis a partir do script para começar?
Comentários
- Não há diferença no resultado final.
Resposta
A velocidade (rápido para lento):
cached _transform >> Component.transform >> Component.GetComponent<Transform>
E se você desmontar um binário UnityEngine.dll C #, poderá ver que a transformação não chama GetComponent (membro da classe Component), apenas chame o método interno de tempo de execução mono. Aqui está o código de transformação.
// UnityEngine.Component public Transform transform { get { return this.InternalGetTransform(); } } [WrapperlessIcall] [MethodImpl(MethodImplOptions.InternalCall)] internal extern Transform InternalGetTransform();
E aqui está a classe de componente desmontada “Método GetComponent.
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 é um tipo de função Finding que usa genéricos. Portanto, é um pouco mais lento do que o armazenamento em cache.
Fonte original:
public class Test : MonoBehaviour { Transform _transform; void Start() { _transform = this.transform; _transform = gameObject.GetComponent<Transform>(); } }
Binário desmontado:
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>(); } }
Resposta
Como Jinbom disse que a principal diferença aqui é a velocidade.
No entanto, é importante notar que este é apenas o caso da propriedade transform de GameObject. Outras propriedades, como câmera e corpo rígido, são apenas propriedades de conveniência e chamam GetComponent <> sob o capô para que o desempenho seja idêntico. É por esta razão que o Unity desprezou essas propriedades “auxiliares” no Unity, pois não é imediatamente óbvio que o Unity vai procurar o componente em vez de retornar uma versão em cache.
Com exceção do transform propriedade mencionada na pergunta, todos os outros componentes devem ser armazenados em cache na primeira oportunidade disponível usando GetComponent <> e esse valor armazenado em cache deve ser usado depois disso.
Resposta
Agora você pode assumir que todos os objetos do jogo terão o componente Transform devido à sintaxe this.transform
. Meu palpite é que o Unity atualizou sua API com a sintaxe GetComponent<>()
para que no futuro você pudesse ter GameObjects sem componentes “especiais” como Transform.
Então você pode ter uma arquitetura “mais pura” onde seus GameObjects não precisam vir com Transforms (embora o editor ainda possa adicioná-los por padrão como uma convenção).
Comentários
-
Transform
é o único componente que age dessa forma. Apesar disso, eu não ' não acho que confiar em especulações futuras seja uma boa resposta. A Unity não mostrou nenhuma sugestão para se mover dessa forma, e eu pessoalmente duvido que eles irão (dado que ter um objeto físico em seu jogo requer que esse objeto contenha informações pertinentes ao seu estado físico, como posição e tamanho ). - Além disso, parece um comentário na minha pergunta, mas não responde.
Resposta
O único motivo pelo qual this.transform
funciona é porque MonoBehavior implementa uma propriedade de conveniência para o componente Transform no GameObject ao qual o comportamento está anexado. … É um tanto enganoso. Acho que gameObject.transform
é semanticamente correto, mas isso é complicado. Eles fazem a mesma coisa.
Comentários
- Isso não fornece nada para responder à minha pergunta real. A única razão pela qual tudo funciona é porque foi configurado para, qual é o seu ponto? Estou perguntando sobre a diferença entre
this.transform
eGetComponent<Transform>()
, nãothis.transform
egameObject.transform
. - Novamente, eles fazem a mesma coisa.