二维碰撞侧行为异常的检测

问题描述

我正在制作一个基本的Breakout游戏,并使用以下代码检测Capsule Collider 2d和圆形对撞机2d之间的碰撞是否发生在顶部:

bool FindIfTopCol(Collision2D other)
{
    print("collider.y " + collidersize.y / 2);
    ContactPoint2D[] contacts = other.contacts;
    if (contacts[0].point.y - transform.position.y > collidersize.y / 2)
    {
        print("top " + (contacts[0].point.y - transform.position.y));
        return true;
    }
    else
    {
        print("not top " + (contacts[0].point.y - transform.position.y));
        return false;
    }
}

在大多数情况下,检测工作正常,但是在运行游戏一段时间后,尤其是在圆形对撞机发生非顶部碰撞之后,该方法似乎将所有碰撞返回为非顶部碰撞。

要弄清问题,我放置了打印语句,这是结果:

Collidery 0.2610874 最高0.2885695

Collidery 0.2610874 不是最高0.2552783 第一次实际的非最高碰撞

Collidery 0.2610874 不是顶部0.2542975 这是一次顶部碰撞,但显示为不是顶部

Collidery 0.2610874 不是顶部0.2558844 这是顶部碰撞,但显示为不是顶部

在我重新启动游戏之前,会话的其余碰撞也是错误的。

我不确定这是怎么回事。

如果还有更好的检测碰撞侧的方法,请告诉我。

解决方法

我不太确定这里发生了什么,但是我将使用OnCollisionEnter2D()事件来检测冲突。然后将接触点与对撞机中心进行比较,以确定其撞击的表面。这是来自kacyesp的示例。

Vector3 contactPoint = collision.contacts[0].point;
Vector3 center = collider.bounds.center;

bool right = contactPoint.x > center.x;
bool top = contactPoint.y > center.y;