关于网格位置的Unity3d Raycast

时间:2016-01-19 16:23:37

标签: c# unity3d coordinates mesh

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

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

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

1 个答案:

答案 0 :(得分:1)

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

编辑脚本使用:

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

例如,如果您的街道上有一个门,单击它将调用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的类,它将为街道上的所有可交互对象提供唯一的界面。街道本身也可以从这个界面继承。