我是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));


是由于舍入不正确吗?

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

最佳答案

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

如果不:
冷静,您的解决方案似乎可以工作!

如是:
您将必须通过添加皮肤来增加对撞机的大小。这是一种增加对撞机被撞的可能性的技术。如果被击中,则可能需要验证击中点,以判断该击中是否确实是命中。您仍然会遇到浮动错误,并且可能必须配置可接受的错误距离(皮肤宽度)。我希望下面的图片能说明我的观点。

c# - Unity3d 2D Raycast有时会通过PolygonCollider2D的点进行调用-LMLPHP

在第一张图片中,是射线投射未击中对撞机的示例。
请注意,我图像中的尺寸已更改,以说明我的观点。

c# - Unity3d 2D Raycast有时会通过PolygonCollider2D的点进行调用-LMLPHP

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

请记住,浮点数的精确度不能精确。如果要进行精确的数学运算,则需要以某种方式解决该问题。在这种情况下,解决方案是添加皮肤。对于您来说,这可能并不容易,因为您正在使用多边形对撞机。

关于c# - Unity3d 2D Raycast有时会通过PolygonCollider2D的点进行调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44367834/

10-10 15:30