Unity3D射线检测场景中的指定模型(射线检测中的Layer层级设置)

利用Unity3D引擎制作游戏或应用时,在复杂的场景中,经常需要鼠标点击指定模型或模型部位来完成交互操作,通常我们需要利用射线检测来进行,来查看一条射线是否与场景中的碰撞体相交。

射线检测可以用来实现很多不同的功能,如点击选择物体、射击命中检测等,需要用Physics.Raycast() 方法来实现。

public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance, int layerMask);

其中:

ray :射线碰撞检测的光线。

hitInfo:out类型,可得到碰撞检测的返回值。

maxDistance:碰撞检测的射线长度。

layerMask:在指定层上碰撞检测。

我们在进行射线检测时有时需要忽略掉某些物体的碰撞,从而达到检测物体背后的物体的碰撞,这是个时候我们使用LayerMask,LayerMask的设置有下面几种方式:

LayerMask layerMask = 1 << 3;//打开层级3,只检测层级3
LayerMask layerMask = 0 << 3;//关闭层级3
LayerMask layerMask = (1 << 3) | (1 << 4);//打开层级3和4,只检测层级3、4
LayerMask layerMask = ~(1 << 3);//打开除3以外的层级
LayerMask layerMask = ~(1 << 0);//打开所有层

( 注:int32位掩码即LayerMask,等效图层蒙版 == 启用 / 关闭某几层的 LayerMask 位掩码,1表示开启,0表示关闭 。)

LayerMask layerMask = 1 << LayerMask.NameToLayer(“Name”);
LayerMask layerMask = LayerMask.GetMask("Name"); //LayerMask.GetMask("Name")获取的是一个int值
//Debug.Log(layerMask.value);
public LayerMask clickableLayer;//在Unity3D中进行设置

接下来是Unity3D射线检测场景中的指定模型的实现过程。

一、需要在Unity3D中对需要检测的模型进行设置:

1.增加Collider组件(否则可能不会被射线检测到),检查是否覆盖模型。

2.在场景中增加层(Add Layer)为Clickable。

将需要被检测到的模型或模型的部分层级指定为Clickable。

二、编写脚本代码

将操作直接写在Update()中:

public class MouseItemThroughCamera : MonoBehaviour
{
    //2.参数hitInfo 为out类型,可得到碰撞检测的返回值;
    RaycastHit hit;
 
    //4.参数layerMask 在指定层上碰撞检测(注意是public,不然在脚本属性那儿找不到指定的层,坑)
    public LayerMask clickableLayer;
 
    void Update()
    {  
        //1.参数ray 为射线碰撞检测的光线(返回一个从相机到屏幕鼠标位置的光线)
        Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
        
        if (Physics.Raycast(ray, out hit, 50, clickableLayer.value)) //如果碰撞检测到物体
        {
           Debug.Log("111");//点击指定模型后需要进行的操作
        }
    }
}

或单独写为方法后在Update中引用进行后续操作:

void Update()
    {
        PressureClick();
    }

public LayerMask clickableLayer;
public void PressureClick()
    {
        if (Input.GetMouseButton(0))
        {
            Ray ray = EMSelectCamera.ScreenPointToRay(Input.mousePosition);
            RaycastHit hit;
            bool raycast = Physics.Raycast(ray, out hit, 500, clickableLayer.value);
            if (raycast)
            {
                Debug.Log("111");//如果点击到指定模型,输出111
            }
            else
            {
                Debug.Log("222");//如果没有点击到指定模型,输出222
            }
        }
    }

可以将PressureClick()改为bool函数进行Update()中的判断。

注意:射线检测需要使用层级Layer时,如果不指定射线的长度,忽略层级很可能会不起作用,因此这里使用layerMask时指定射线的maxDistance。

三、将脚本赋给Unity3D中的GameObject(不一定非要挂在检测的模型上)

设置脚本中的clickableLayer为检测模型所在的层级Clickable。

以上操作即可完成指定模型的检测。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值