网格位置上的 Unity3d 光线投射

本文关键字:Unity3d 光线投射 位置 网格 | 更新日期: 2023-09-27 18:31:11

我想用光线投射击中网格并获取命中发生位置的鼠标/屏幕坐标。

public class GetCoordinates: MonoBehaviour {
    private GameObject _objectToHit;
    private RaycastHit hit;
    private Collider coll;
    private Ray ray;
    private float hitDistance = 200f;
    void Start()
    {
        coll = GetComponent<Collider>();
        _objectToHit = GameObject.Find("Street");
    }
    void Update()
    {
        ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        if (coll.Raycast(ray, out hit, hitDistance))
        {
              Debug.Log(hit.point);
        }
    }
}

我也不确定在哪里添加脚本,被击中的对象或相机?

网格位置上的 Unity3d 光线投射

您希望使用 Camera.WorldToScreenPoint 将世界命中点位置转换为屏幕位置。此外,您的游戏中只需要此脚本的一个实例,否则您将有多个光线投射。在选择放置此脚本的位置之前,应考虑这一点。如果没有有关其用途,多少对象等的更多信息,我们无法帮助您做出此选择。

编辑关于脚本使用:

有一件事是肯定的:光线投射脚本必须有一个唯一的实例。如果要通过此脚本与其他对象进行交互,则应使用 hit.collider.gameobject 上的 GameObject.GetComponent 函数,以便访问将执行所需操作的脚本。

例如,如果你的街道上有一个门,点击它将在门对象上调用 GateBehavior 脚本中包含的 toggleOpen() 函数,如下所示:

if (coll.Raycast(ray, out hit, hitDistance))
{
    if(hit.collider.tag == "Gate")
    {
        GateBehaviour gate = hit.collider.gameobject.GetComponent<GateBehaviour>()
        if(gate)
            gate.toggleOpen();
    }
    Debug.Log(hit.point);
}

理想情况下,您应该有一个名为Interractable的类,它将为街道上的所有可交互对象提供唯一的接口。街道本身也可以继承此接口。