繁体   English   中英

网格位置上的Unity3d Raycast

[英]Unity3d Raycast on mesh position

我想用射线投射打一个网格,并获取发生打点的鼠标/屏幕坐标。

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

另外,我不确定将脚本添加到被击中对象还是摄像机的位置?

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

编辑有关脚本的用法:

可以肯定的是:射线投射脚本必须具有唯一的实例。 如果你想通过这个脚本与其他对象进行交互,你应该使用GameObject.GetComponent以访问脚本,将做你想要的东西上hit.collider.gameobject功能。

例如,如果您的街道上有一个门,则单击该门将调用Gate对象的GateBehaviour脚本中包含的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的类,该类将为街道上的所有可交互对象提供唯一的接口。 街道本身也可以从此接口继承。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM