我是 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));
是否是由于四舍五入不良造成的?
如果是这样,我该如何解决?
最佳答案
问题源于浮点精度。当涉及到 float 时,您无法进行精确的比较。如果您使用在世界各地移动的普通对撞机,这通常没问题,因为人眼无法注意到非常小的偏移。问题是:
您需要精确定位多边形角点吗?
如果没有:
很酷,你的解决方案似乎有效!
如果是:
您必须通过添加皮肤来增加对撞机的大小。这是一种增加对撞机被击中可能性的技术。如果它被击中,您可能需要验证击中点以确定击中是否真的击中。您仍然会遇到 float 错误,并且可能必须配置可接受的错误距离(皮肤宽度)。我希望下面的图片能够说明我的观点。
在第一张图片中是光线转换未击中对撞机的示例。
请注意,我的图像中的尺寸并未说明我的观点。
这里我们仍然只使用 1 个对撞机,但我们增加了它的大小。
请记住,浮点运算不可能精确。如果你想做精确的数学,你将需要以某种方式解决这个问题。在这种情况下,解决方案是添加皮肤。这对您来说可能不太容易,因为您使用的是多边形碰撞器。
关于c# - Unity3d 2D Raycast 有时会调用穿过 PolygonCollider2D 的点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44367834/