Unity Physics2D.Raycast 遇到大型 2D 碰撞体的问题
Unity Physics2D.Raycast having trouble with large 2D colliders
我有一个非常简单的 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");
}
我将图像对象添加到 Canvas 在屏幕中渲染 Space:相机,并将 Box Collider 2D 组件添加到图像。
当鼠标指针在 Box Collider 2D 内部但不在外部时,上面的代码会记录 "hit something",这正是我想要的。
但是,只有当盒子对撞机的尺寸小于 120 x 120 时才适用。如果它是那个大小或更大,我开始在屏幕上到处都得到日志输出 - Physics2D.Raycast returns 屏幕上到处都是。 Physics2D.Raycast 似乎认为对撞机突然占据了整个屏幕,但实际上并没有,它甚至离得很近。将对撞机缩小到 115 x 115 可以解决问题,但正如您所想象的那样,我不希望某些对撞机尺寸出现特殊行为。
图片大小为 100x100。如果我将对撞机大小设置为 1x1(几乎不可见),Raycaster 会命中整个 100x100 图像。
图片大小没有影响。有谁知道为什么这个神奇的尺寸突然比指定的大?
编辑:我对 CircleCollider2D 也有同样的问题 - 如果半径超过 100 左右,我会突然在整个屏幕上与它碰撞。
Physics2D.Raycast 用于二维 space。由于我在 3D space 中使用 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");
}
我有一个非常简单的 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");
}
我将图像对象添加到 Canvas 在屏幕中渲染 Space:相机,并将 Box Collider 2D 组件添加到图像。
当鼠标指针在 Box Collider 2D 内部但不在外部时,上面的代码会记录 "hit something",这正是我想要的。
但是,只有当盒子对撞机的尺寸小于 120 x 120 时才适用。如果它是那个大小或更大,我开始在屏幕上到处都得到日志输出 - Physics2D.Raycast returns 屏幕上到处都是。 Physics2D.Raycast 似乎认为对撞机突然占据了整个屏幕,但实际上并没有,它甚至离得很近。将对撞机缩小到 115 x 115 可以解决问题,但正如您所想象的那样,我不希望某些对撞机尺寸出现特殊行为。 图片大小为 100x100。如果我将对撞机大小设置为 1x1(几乎不可见),Raycaster 会命中整个 100x100 图像。
图片大小没有影响。有谁知道为什么这个神奇的尺寸突然比指定的大?
编辑:我对 CircleCollider2D 也有同样的问题 - 如果半径超过 100 左右,我会突然在整个屏幕上与它碰撞。
Physics2D.Raycast 用于二维 space。由于我在 3D space 中使用 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");
}