首页 > 解决方案 > 使用任何形状碰撞器测试一个游戏对象是否在另一个之上

问题描述

本质上,我有一个函数旨在测试一个对象是否完全位于另一个对象之上,同时考虑对撞机边界:

public static bool isAbove(GameObject a, GameObject b)
{
    Collider2D colliderA = a.GetComponent<Collider2D>();
    Collider2D colliderB = b.GetComponent<Collider2D>();
    return a.transform.position.y - (colliderA.bounds.size.y * 0.5) >= b.transform.position.y + (colliderB.bounds.size.y * 0.5);
}

当我最初写这篇文章时,我无意使用框以外的边界形状,所以算法有效。现在,我在其中一个对象上使用圆形碰撞器,在另一个对象上使用盒子碰撞器,这使得算法不一致,因为它仍然将圆形视为盒子。我真的希望这适用于任何组合的任何形状对撞机。

我认为我可以在第一个对象正下方指定一个点,然后在该 x 位置找到最大点,但我无法在任何地方找到此选项,我仍然不确定这是否是我应该寻找的解决方案.

标签: c#unity3d

解决方案


正如我在评论中提到的,Collision2D有很多关于两个物体碰撞的有用信息。专门针对您的用例,我还将研究Vector3.Dot. 简而言之,使用Vector3(up, otherObject会给你一个结果来确定两个对象是否相互重叠。

为了更清楚一点,可以返回三种可能的情况,Vector3.Dot它们是

  1. 点为 0 - 两个对象彼此完全垂直
  2. 点 <0 - 两个对象之间的角度大于 90º
  3. Dot is >0 - 两个对象之间的角度小于 90º

对于您的特定用例,我将计算上向量和到另一个目标的向量之间的点积。如果结果大于 0,则另一个目标在您当前对象的上方。您可以仅在对象主动碰撞时检查此数据,也可以每帧检查一次。这取决于您要检查的对象数量。


推荐阅读