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

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

当鼠标位于门(红色区域)时我想做点什么。我正在尝试投射射线,但射线没有击中门,而且我无法找到它到底击中的位置。另外我怎样才能

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

c# unity-game-engine raycasting
3个回答
0
投票

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

在绘制射线方面,以防由于某种原因无法正常工作。使用 Debug.DrawRay。我建议将其放在FixedUpdate() 或Update() 中。您可以将颜色和持续时间设置为您想要的任何值,但我建议将 heightTest 设置为 false,因为您希望无论如何都绘制光线。然后这样称呼它:

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

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
。关于 Vector3 和 Vector2 的 Unity 文档似乎表明您应该能够隐式地将 Vector2 用作 Vector3,并且它将 z 分量填充为 0,但是如果
Debug.DrawRay
显示光线是问题所在,那么您需要附加一个0.也许是这样的:

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

0
投票

解决方法是转到您的相机并将 tag 设置为“MainCamera”。或者您可以修改代码以拥有相机变量并使用该变量而不是 Camera.main。

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