Unity3d 2D Raycast 调用有时会通过 PolygonCollider2D 的点

Unity3d 2D Raycast calls sometime passing through PolygonCollider2D's points

我是Unity新手!

我的 Raycast2D 调用发出的光线有时会穿过我的 PolygonCollider2D 的点,我不知道为什么。

下图中用一条黄色的小水平线标记了命中。

预期行为:

穿过的光线:

这是我的代码:

path 是 PolygonCollider2D 的红点)

Debug.DrawLine(origin, new Vector3(path[i].x, path[i].y, 0), Color.yellow, 0, false);
float angle = Mathf.Atan2(path[i].y - origin.y,  path[i].x - origin.x);
Vector2 direction = new Vector2(Mathf.Cos(angle), Mathf.Sin(angle));
RaycastHit2D hit = Physics2D.Raycast(origin, direction);
Debug.DrawLine(new Vector3(hit.point.x, hit.point.y, 0), new Vector3(hit.point.x - .2f, hit.point.y, 0), Color.yellow);
Debug.DrawRay(new Vector3(origin.x, origin.y, 0), new Vector3(direction.x, direction.y));

是因为四舍五入不好吗?

如果是这样,我该如何解决?

问题源于浮点精度。当涉及浮点数时,您无法进行精确比较。如果您使用的是在世界范围内移动的普通对撞机,这通常没问题,因为人眼无法注意到非常微小的偏移。问题是:
您需要击中多边形角的非常精确的位置吗?

如果没有:
很酷,您的解决方案似乎有效!

如果是:
您必须通过添加 skin 来增加对撞机的大小。这是一种增加对撞机被击中可能性的技术。如果它被命中,您可能需要验证命中点以确定命中是否真的命中。您仍然会 运行 陷入浮动错误,您可能必须配置可接受的错误距离(皮肤宽度)。我希望下面的图片能说明我的观点。

第一张图片是您的光线投射未命中对撞机的示例。
请注意,我的图像中的尺寸已关闭以说明我的观点。

这里我们仍然只使用 1 个对撞机,但我们增加了它的大小。

请记住,浮点运算不可能是精确的。如果你想做精确的数学运算,你需要以某种方式解决这个问题。在这种情况下,解决方案是添加一个 skin。这对你来说可能不是很容易,因为你正在使用多边形碰撞器。