Unity3D之射线检测

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

一.单射线检测单个物体

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

// Update is called once per frame
	void 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+"个物体");
    }
以上代码是我觉得我们会经常使用到的射线代码,可是满足大部分项目需求。希望对你有帮助。

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



©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页