组件之间的任何差异.CompareTag()和GameObject.压缩标签()



我想知道这两个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");
}
}

我怀疑它们应该是相同的——一个组件总是连接到一个并且只有一个游戏对象,所以它应该不需要访问组件的";。gameObject";参考第一。据我所知,两个调用的行为完全相同。

我想知道是因为:

  1. 调用otherCollider.gameObject.CompareTag((不会导致"名称可以简化"警告。这可能是因为这些类和方法位于UnityEngine命名空间中,因此不在VisualStudio的警告范围内
  2. Unity文档中的组件示例。CompareTag((显式使用调用的较长形式:other.gameObject.CompreTag("Player"(。这可能只是GameObject中草率复制粘贴的结果。CompareTag((方法的文档,其中提供了一个相同的示例?https://docs.unity3d.com/ScriptReference/Component.CompareTag.html

如果您查看Component.CompareTag()的实际代码,您将看到:

// 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);
}

所以,如果你想深入到";在引擎盖下";在微优化级别上,当你调用Component.CompareTag()时,你也在调用gameObject属性,它有自己的处理时间来访问它。现在,处理时间并不多,但它是存在的,因为属性的处理开销与方法调用相似,因为它们本质上是相同的。

然后流程进入组件。比较标记((->组件.gameObject{get}->游戏对象。比较标记((。

因此,长话短说,如果你可以调用调用堆栈中更底层的方法,而不是顶级的辅助方法,那么你最好选择性能更高的方法——GameObject.CompareTag()

对于您给出的示例,它本质上是通过直接访问ComponentgameObject属性来保存一个方法调用。

最新更新