Unity Physics2D.Raycast遇到大型2D对撞机问题

时间:2017-01-17 15:22:22

标签: c# unity5

我有一个非常简单的Unity组件,用于检查鼠标屏幕位置是否在2D对撞机内。

var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
RaycastHit2D hit = Physics2D.Raycast(screenRay.origin, screenRay.direction);
if (hit)
{
    Debug.Log("hit something");
}

我将一个Image对象添加到在屏幕空间中渲染的Canvas:Camera,以及一个Box Collider 2D组件到图像。

当鼠标指针位于Box Collider 2D内部时,上面的代码会记录“hit something”,而不是在外面时,这就是我想要的。

然而,只有当盒式对撞机的尺寸小于120 x 120时才会出现这种情况。如果它是那个大小或更大,我开始在屏幕上的任何地方获得日志输出 - Physics2D.Raycast返回屏幕上的内容。 Physics2D.Raycast似乎认为对撞机突然占据了整个屏幕,它没有,它甚至都没有接近。将对撞机缩小到115 x 115可以解决问题,但正如您可以想象的那样,我不希望在某些对撞机尺寸上出现特殊行为。 图像大小为100x100。如果我将对撞机尺寸设为1x1(几乎不可见),则Raycaster会对整个100x100图像进行点击。

图像的大小无效。有谁知道为什么这个魔法大小突然大于指定的?

编辑:我对CircleCollider2D也有同样的问题 - 如果半径超过100左右,我突然在整个屏幕上与它发生碰撞。

1 个答案:

答案 0 :(得分:0)

Physics2D.Raycast旨在用于2D空间。由于我在3D空间中使用UI元素,Physics2D.Raycast没有按预期工作,因此应该使用GetRayIntersection。这段代码运行良好:

var screenRay = Camera.main.ScreenPointToRay(new Vector3(eventData.position.x, eventData.position.y, 0.0f));
RaycastHit2D hit = Physics2D.GetRayIntersection(screenRay);
if (hit)
{
    Debug.Log("hit something");
}