我正在尝试在使用 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
尝试这样的事情:
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
来查看射线是否正确。好吧,我发现了问题。我会将其发布在这里,以防其他人偶然发现此类问题并且似乎无法使其工作。
简单来说,检查你的相机变换。我的 Y 轴偏移量不知何故为 1,这把一切都搞乱了。
仅给出我经过3小时搜索后的经验: 我的问题是 boxcollider2D 边界已更改(并设置为 0),但仅在编辑器之外,因为 #if UNITYEDITOR 的事情。
-> 检查碰撞器的边界。