繁体   English   中英

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

我将Image对象添加到在“屏幕空间:相机”中渲染的Canvas,并将Box Collider 2D组件添加到图像。

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

但是,仅当盒对撞机的尺寸小于120 x 120时,这才是正确的。 如果是那个大小或更大,我开始在屏幕上的任何地方获取日志输出-Physics2D.Raycast在整个屏幕上返回内容。 Physics2D.Raycast似乎认为对撞机突然占据了整个屏幕,但实际上并没有,甚至还没有关闭。 将对撞机缩小到115 x 115可以解决此问题,但是正如您可以想象的那样,我不希望在某些对撞机尺寸上出现特殊行为。 图片尺寸为100x100。 如果我将对撞机的大小设置为1x1(几乎看不到),则Raycaster会在整个100x100的图像上命中目标。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM