从相机到游戏世界中鼠标位置的射线投射

5

当鼠标在门(红色区域)时,我想做一些事情。我试图投射一个射线,但是射线没有击中门,我无法找到它确切的位置。另外,我该如何使用Debug.DrawRay来调试这条射线?

Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
RaycastHit hit;

if (Physics.Raycast(ray, out hit, Mathf.Infinity)) 
{
    if (hit.collider.tag == "InteractiveDoor")
    {
        doorInteractGameObject.SetActive(true);
    }
    else
    {
        doorInteractGameObject.SetActive(false);
    }
}

Unity Img


“它不起作用”并不是一个具体的问题。然而,如果提供了最小可重现源代码,那就更好了!请更具体地说明“不起作用”的情况。控制台中是否有错误?期望的行为是什么,实际发生了什么?编辑您的问题并澄清。 - Pinke Helga
没有错误,射线投射功能是正常的,但它没有击中我想要的位置。我正在尝试使用debug.drawray来查看它到底打到了哪里,但是由于Camera.main.ScreenPointToRay(Input.mousePosition)是一个射线而不是Vector3,我无法找到如何实现。 - Gerte
1
目标上有碰撞体吗? - Pinke Helga
2
天啊,我真是太蠢了 :) 我在九个方块的父物体上添加了一个球形碰撞器,然后错误地认为这就足够了。我给所有九个方块都添加了盒子碰撞器,现在代码可以正常工作了。感谢您的帮助! - Gerte
3个回答

0
您可以这样绘制射线:
Debug.DrawRay(ray.origin, ray.direction);

或者

Debug.DrawRay(Camera.main.transform.position, Camera.main.ScreenPointToRay(Input.mousePosition).direction);

一旦定义了光线,选项1更直接,但选项2可以让您有更多的选择来玩耍,如果发现这条射线的行为与您预期的不同。

camera.ScreenPointToRay需要一个Vector3,但Input.mousePosition返回一个Vector2。Unity关于Vector3和Vector2的文档表明,您应该能够将Vector2隐式地用作Vector3,并且它会将z分量填充为0,但是如果Debug.DrawRay显示射线存在问题,则需要附加0。也许像这样:

Ray ray = Camera.main.ScreenPointToRay(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));

1
第一个可以工作,但它并不完全准确地代表真正的Ray。第二个会出错,因为Debug.DrawRay需要Vector3,而Camera.main.ScreenPointToRay是一个Ray。 - Gerte
第二个方法好捕捉! 我更新了我的响应,以便返回射线方向的Vector3。 如果第一个方法没有绘制您期望的射线,则可能没有构建您打算调用的射线,因为第一个方法直接调用射线。 基于ScreenPointToRay是相机对象的方法,第二种方法的起点是我猜测射线应该开始的位置。 不过,根据您对原始问题的评论,听起来您已经解决了这个问题,因此现在一切都应该正常工作。 当鼠标位于门边缘时,它的行为如何? - jkidd
1
只要鼠标位于我添加了碰撞器和标签的9个框之一,它就可以正常工作。 - Gerte

0

你可能需要创建一个LayerMask并将其添加到Physics.Raycast的参数中;还要确保门上有一个碰撞器。你会惊讶地发现,我经常忘记添加碰撞器。

如果出现问题无法绘制射线,请使用Debug.DrawRay。我建议将其放在FixedUpdate()或Update()中。颜色和持续时间可以设置为任何你想要的,但我建议depthTest为false,因为你希望射线被绘制出来。然后像这样调用:

Debug.DrawRay(ray.origin, ray.direction, <color>, <duration>, false);

0
解决方法是进入您的相机并将标签设置为“MainCamera”。或者您可以修改您的代码以具有摄像机变量,并使用该变量而不是Camera.main。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接