当鼠标位于门(红色区域)时我想做点什么。我正在尝试投射射线,但射线没有击中门,而且我无法找到它到底击中的位置。另外我怎样才能
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);
}
}
您可能需要创建一个LayerMask并将其添加到Physics.Raycast的参数中;还要确保门上有碰撞器。你会惊讶地发现有多少次我忘记添加对撞机。
在绘制射线方面,以防由于某种原因无法正常工作。使用 Debug.DrawRay。我建议将其放在FixedUpdate() 或Update() 中。您可以将颜色和持续时间设置为您想要的任何值,但我建议将 heightTest 设置为 false,因为您希望无论如何都绘制光线。然后这样称呼它:
Debug.DrawRay(ray.origin, ray.direction, <color>, <duration>, false);
您可以将这条射线绘制为:
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
。关于 Vector3 和 Vector2 的 Unity 文档似乎表明您应该能够隐式地将 Vector2 用作 Vector3,并且它将 z 分量填充为 0,但是如果 Debug.DrawRay
显示光线是问题所在,那么您需要附加一个0.也许是这样的:
Ray ray = Camera.main.ScreenPointToRay(new Vector3(Input.mousePosition.x, Input.mousePosition.y, 0));
解决方法是转到您的相机并将 tag 设置为“MainCamera”。或者您可以修改代码以拥有相机变量并使用该变量而不是 Camera.main。