Unity3D之射线检测

来源:互联网 发布:当程序员好吗 编辑:程序博客网 时间:2024/06/05 05:45

开发中我们经常遇到鼠标和三维物体交互的需求,要操作三维空间的物体,首先要选中这个物体,这时候就需要我们经常用到的射线检测。

一.单射线检测单个物体

代码使我们通用的射线检测代码,注释也已经标识上去了。

// Update is called once per framevoid Update ()    {        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机沿着屏幕鼠标位置方向发射一条射线        RaycastHit hit; //射线检测返回的信息        if (Physics.Raycast(ray, out hit)        {            if (hit.collider.CompareTag("model"))            {                Debug.Log("选中Tag为model的物体");            }        }    }
当然如果项目中有些物体因为需要发生物理碰撞必须要加上collider而又不想被射线检测到,这时候我们就可以使用layMasker来选择性射线检测。代码如下:

 private float maxDistance = 1000f;//射线的最大长度    private LayerMask lm1=1 <<8; // 只检测到Layer层id为8的物体    private LayerMask lm2 = ~(1 << 8);//只检测不到Layer层id为8的物体    private LayerMask lm3 = (1 << 8) | (1 << 9);//只检测不到Layer层id为8和9的物体    // Update is called once per frame    void Update ()    {        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机沿着屏幕鼠标位置方向发射一条射线        RaycastHit hit; //射线检测返回的信息        if (Physics.Raycast(ray, out hit, 1000, lm1))//射线只能检测到layer层id为8的物体        {            if (hit.collider.CompareTag("model"))            {                Debug.Log("选中Tag为model的物体");            }        }    }
二.射线检测返回物体信息数组

获取射线检测到的所有物体。以数组的形式返回所有碰撞体信息。

private RaycastHit[] hits;    private void Update()    {        Ray ray= Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机沿着屏幕鼠标位置方向发射一条射线        hits = Physics.RaycastAll(ray);  //将所有射线检测到的物体以数组形式保存下来        Debug.Log("改射线碰撞检测到"+hits.Length+"个物体");    }
以上代码是我觉得我们会经常使用到的射线代码,可是满足大部分项目需求。希望对你有帮助。

好记性不如烂笔头。我觉得即使我现在了解的滚瓜烂熟,只怕时间一长还是会忘了部分细节。所以在记录下来的同时还可以给大家一个帮助。一起进步吧!



原创粉丝点击