Unity中的分层射线检测

这是我所写的第一篇有关Unity的博文,介绍的是我最近学习uinty时遇到的一个有关射线检测的问题以及后来解决的一些思路,射线检测;
  if (Input.GetMouseButton(0))
        {
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitinfo;
            if (Physics.Raycast(ray, out hitinfo))
            {
                print(hitinfo.collider.name);
                if (hitinfo.collider.name == this.gameObject.name )
                {
                    
                    if (dir == direction.left)
                    {
                        player.GetComponent().revolve_in_2D_left();
                    }
                    else if (dir == direction.right)
                    {
                        player.GetComponent().revolve_in_2D_right();
                    }
                }
            }
        }
	
	}

以上是我写的一个点击触发UI按钮的脚本,在这之中的ray是我们自己定义的一条射线,后面的函数则是为其定义,在这里说一下,定义射线的方法有2种,一种是使用函数ScreenPointToRay(Vector3 startposition);用这个函数定义的是一条起点为startposition,方向为摄像机过起点的方向的射线。而后面的RaycastHit类型的变量的作用是的到射线碰撞时所产生的相关信息,包括碰撞的物体的名字,刚体组件,和transform组件。有了这些我们就可以很容易的判断出射线是否碰撞到了我们的目标物体。还有一种方法是使用函数ViewportPointToRay(Vector3   postion),用这个函数定义的是一条从摄像开始,透过从相机的近裁剪面上的视口POSITION(x,y)坐标的一条射线。不过这种方法平时使用的不是很多。

但是这种射线检测存在一个问题,就是假如当空间内的要求被物体在某些时刻被其他物体阻挡的话,就可能无法检测到被要求的物体,因为射线的终点就是被碰撞到的物体,这个时候我们就需要用到一个分层的方法,首先我们可以在layer面板上添加层级,将我们要检测的物体和不需要检测的物体放在不同的layer下面,然后我们在使用Physice.Raycast这个函数的时候可以在后面添加一个参数LayerMask型的变量mask,这种重载方法下我们的射线的检测碰撞的时候就只会检测改层的物体,而不会受到其他物体的干扰

下面是我的样例代码:

void Update () {
        if (Input.GetMouseButton(0))
        {
            Ray ray = camera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hitinfo;
            if (Physics.Raycast(ray, out hitinfo,200,mask))
            {
                print(hitinfo.collider.name);
                if (hitinfo.collider.name == this.gameObject.name && (hitinfo.collider.tag == "right_button" || hitinfo.collider.tag == "left_button"))
                {
                    
                    if (dir == direction.left)
                    {
                        player.GetComponent().revolve_in_2D_left();
                    }
                    else if (dir == direction.right)
                    {
                        player.GetComponent().revolve_in_2D_right();
                    }
                }
            }
        }
	
	}


下面是一个我自己制作的小游戏,这个游戏中的小球是会旋转的,而控制小球旋转的是2个我用射线检测的方法制作的2个UI按钮,当小球旋转到一定角度的时候,小球的位置会阻挡摄像机的射线,但是设置分层之后,就没有了这个问题,小球就不会被射线检测到Unity中的分层射线检测_第1张图片

你可能感兴趣的:(Unity游戏开发)