Me gustaría saber si hay alguna diferencia oculta en la ejecución de estas dos llamadas a CompareTag():
private void OnTriggerEnter(Collider otherCollider) { if (otherCollider.CompareTag("TestTag")) { Debug.Log("The other Collider is tagged: TestTag"); } if (otherCollider.gameObject.CompareTag("TestTag")) { Debug.Log("The other GameObject is tagged: TestTag"); } }Sospecho que deberían ser idénticos: un Componente siempre se adjunta a uno y solo un GameObject, por lo que no debería ser necesario acceder primero a la referencia ".gameObject" del Componente. Ambas llamadas se comportan de manera idéntica por lo que puedo decir.
Me pregunto porque:
Si observa el código real de Component.CompareTag() , verá esto:
// UnityEngine.Component /// <summary> /// <para>Is this game object tagged with tag ?</para> /// </summary> /// <param name="tag">The tag to compare.</param> public bool CompareTag(string tag) { return gameObject.CompareTag(tag); } Entonces, si desea llegar a la implementación "bajo el capó", a un nivel de microoptimización, cuando llama a Component.CompareTag() , TAMBIÉN está llamando a la propiedad gameObject también, que tiene su propio tiempo de procesamiento asociado con el acceso a la misma. Ahora, ese tiempo de procesamiento no es enorme, pero ESTÁ ahí porque las propiedades tienen gastos generales de procesamiento similares a las llamadas a métodos, ya que son esencialmente lo mismo.
Luego, el proceso va Component.CompareTag() -> Component.gameObject{get} -> GameObject.CompareTag().
Entonces, en pocas palabras, si puede llamar a un método más abajo en la pila de llamadas, en lugar de un método auxiliar de nivel superior, es mejor que elija el de mayor rendimiento: GameObject.CompareTag() .
En cuanto al ejemplo que diste, esencialmente está guardando una llamada de método, accediendo directamente a la propiedad Component gameObject .