c# - Unity3d 2D Raycast 有时会调用穿过 PolygonCollider2D 的点

标签 c# unity-game-engine unity3d-2dtools

我是 Unity 初学者!

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

是否是由于四舍五入不良造成的?

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

最佳答案

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

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

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

enter image description here

在第一张图片中是光线转换未击中对撞机的示例。
请注意,我的图像中的尺寸并未说明我的观点。

enter image description here

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

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

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

相关文章:

c# - 接受字母数字字符(6-10 个字符)的正则表达式 .NET、C#

C# 可移植 IDE 和编译器 - 它需要的一切都需要在 USB 闪存驱动器上

c# - 检测 Apple 订阅过期

c# - htmlagilitypack 选择节点返回空

c# - 在 Unity 中加密,在 Node.js 中解密

android - Unity 3d 中的 PlayerPrefs 不起作用(有时)

c# - 在 Unity 中向鼠标位置发射炮弹

unity3d - unity scrollview 无法滚动到最后

unity-game-engine - 我可以在游戏中混合 2d 和 3d 场景吗

c# - 使用授权属性时的 Cors 策略错误