移动设备上的 2D 光线投射给出了奇怪的结果

问题描述 投票:0回答:3

我正在尝试在使用 Unity 开发的原型中检测对撞机的简单点击。问题是,虽然它检测到碰撞,但有时似乎偏离目标。

这就是我所拥有的

Vector2 point = Camera.main.ScreenToWorldPoint(Input.GetTouch(0).position);
RaycastHit2D hit = Physics2D.Raycast(point, Vector2.zero);
if (hit.collider != null)
{
          //Do stuff
}

我预计它只会单独在对撞机上发生。 我添加了一些文本日志以确保它不会碰到其他东西。

这里有一个小图片来解释。蓝色是应该识别点击的地方,红色是我用手指点击的地方,它仍然可以识别它,就像我点击了蓝色一样。 https://gyazo.com/7462de174d30b2d81a30c17f2bbc62fa

c# unity-game-engine mobile 2d
3个回答
0
投票

尝试这样的事情:

Vector3 screenTouchPos = Input.GetTouch(0).position;
screenTouchPos.z = 1f; // distance to the camera

Vector2 point = Camera.main.ScreenToWorldPoint(screenTouchPos);

此处说明:ScreenToWorldPoint() 不起作用

ScreenToWorldPoint 接收 Vector3 参数,其中 x 和 y 是屏幕坐标,z 是距相机的距离。由于 Input.mousePosition.z 始终为 0,因此您得到的是相机位置。


精度:这应该只是透视相机投影的问题,而不是正交投影的问题。


编辑:由于这不能解决您的问题,因此这里有一些调试它的技巧(我没有足够的关于您的案例的信息来建议任何内容):

  • 使用
    Debug.DrawLine
    检查
    Vector2 point
    的值是否正确
    • 如果是这样,请检查碰撞器的大小/位置是否正确。
    • 如果不正确,请结合使用
      Camera.ViewportPointToRay
      Debug.DrawLine
      来查看射线是否正确。

0
投票

好吧,我发现了问题。我会将其发布在这里,以防其他人偶然发现此类问题并且似乎无法使其工作。

简单来说,检查你的相机变换。我的 Y 轴偏移量不知何故为 1,这把一切都搞乱了。


0
投票

仅给出我经过3小时搜索后的经验: 我的问题是 boxcollider2D 边界已更改(并设置为 0),但仅在编辑器之外,因为 #if UNITYEDITOR 的事情。

-> 检查碰撞器的边界。

© www.soinside.com 2019 - 2024. All rights reserved.