我有一个非常简单的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左右,我突然在整个屏幕上与它发生碰撞。
答案 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");
}