2017-06-05 47 views
2

我是Unity初学者!Unity3d 2D Raycast调用有时穿过PolygonCollider2D的要点

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

点击在下图中以黄色的小水平线标出。

预期的行为:

Image: working

甲射线穿过:

image: not working

这是我的代码:

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

是否由于四舍五入?

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

+0

你有没有尝试将你的对撞机缩小一点?这可能是因为你的广场上有漂浮物。 – Fiffe

+0

缩放并没有帮助。 – Ploppy

回答

2

该问题源自浮点精度。当涉及花车时,你无法做出精确的比较。如果您使用的是在世界中移动的普通对撞机,这通常很好,因为人眼无法注意到非常小的偏移量。问题是:
您是否需要击中多边形拐角的确切位置?

如果不是:
酷你的解决方案似乎工作!

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

enter image description here

在第一形象是你的光线投射不打对撞机的例子。
请注意,我的图像中的尺寸是为了说明我的观点。

enter image description here

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

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

+0

而不是像你说的那样实现可能很复杂的皮肤,我决定稍微抵消一点:'worldPath [i] = new Vector2(path [i] .x * .99f + this.transform.position.x,path [我] .y * .99f + this.transform.position.y);'这似乎工作。你怎么看待这件事? – Ploppy

+0

当然,你必须确定你的对撞机的尺寸或投射不同的光线。它应该工作:)但请注意,您当前的解决方案具有动态更正。对撞机越大,修正越大。校正将始终为该点位置的1%。如果这证明会导致问题,您将需要实施静态更正。 –

+0

非常感谢您的解释。我会接受你的解决方案。 – Ploppy