【每日一题】屏幕射线检测成功案例及解决办法

【每日一题】屏幕射线检测成功案例及解决办法

【学习目标】 能够通过光线检测进行碰撞判断 能够通过玩家点击屏幕来检测选中的物体【光线检测】

unity射线检测正前方的物体_unity射线检测获得3d物体_unity射线检测检测不到物体

【3D世界的光线】

由线段一端无限延伸形成的直线,由起点和方向两个关键属性组成

在代码中创建一个射线对象

在代码中创建一个射线对象

unity射线检测获得3d物体_unity射线检测正前方的物体_unity射线检测检测不到物体

注意:这里画的线段是用来看射线的方向的。真实的光线是从起点到方向的无限延伸【屏幕发出的光线】

根据玩家在屏幕上的点击位置发射光线

在代码中创建屏幕光线

unity射线检测正前方的物体_unity射线检测检测不到物体_unity射线检测获得3d物体

在代码中创建屏幕光线

unity射线检测检测不到物体_unity射线检测获得3d物体_unity射线检测正前方的物体

【雷总结】

单独的ray对我们没有意义,必须和其他模块配合使用

【光线碰撞检测】

Unity 提供的物理课程

物理

提供射线检测相关的方法

unity射线检测正前方的物体_unity射线检测检测不到物体_unity射线检测获得3d物体

以上是Physics类提供的射线检测方法。我们选择几种最常用的方法来解释。学完之后材质材料,你就基本学会了所有的方法【例子】

unity射线检测检测不到物体_unity射线检测正前方的物体_unity射线检测获得3d物体

unity射线检测正前方的物体_unity射线检测检测不到物体_unity射线检测获得3d物体

在游戏界面点击鼠标unity射线检测检测不到物体,点击Panel时,射线检测成功游戏运营,并打印其名称

unity射线检测正前方的物体_unity射线检测获得3d物体_unity射线检测检测不到物体

unity射线检测检测不到物体_unity射线检测获得3d物体_unity射线检测正前方的物体

在游戏界面点击鼠标,当点击红色方块时,射线检测会穿透方块和平面,所以会打印2个名字信息(前提是maxDistance足够大

通过射线检测进行碰撞判断

能够通过玩家点击屏幕来检测选定的对象

【关键参数layerMask】

此参数允许射线检测仅检测指定级别的对象

unity射线检测正前方的物体_unity射线检测获得3d物体_unity射线检测检测不到物体

将场景中的 Cube 级别更改为 Cube(无需在 Add Layer 上创建新的自定义层)

unity射线检测检测不到物体_unity射线检测正前方的物体_unity射线检测获得3d物体

给刚才的代码加个参数

unity射线检测获得3d物体_unity射线检测检测不到物体_unity射线检测正前方的物体

这时候你会发现只会打印Cube的名字。

面板没有被光线检测到unity射线检测检测不到物体,这是因为我们填充了图层蒙版参数

↓↓↓↓

↓↓↓↓

LayerMask.NameToLayer(图层名称)

是Unity提供的一种根据层名将层名转换为层号的方法

↓↓↓↓

↓↓↓↓

层数是多少?

unity射线检测正前方的物体_unity射线检测检测不到物体_unity射线检测获得3d物体

unity射线检测检测不到物体_unity射线检测获得3d物体_unity射线检测正前方的物体

Unity中最多可以有32层,编号从0到31

↓↓↓↓

↓↓↓↓

我们通过LayerMask.NameToLayer(层名)得到一个0到31的层号,然后左移1到“层号”位。也就是说从0到31的每一层都对应一个唯一的二进制数,这个数是2的n次方。

unity射线检测正前方的物体_unity射线检测获得3d物体_unity射线检测检测不到物体

你只需要记住

是固定拼写

通过它来确定层

↓↓↓↓

↓↓↓↓

如果要检测多层怎么写?

由于二进制的特性,如果要检测多个隔间,只需要对不同的层进行位或操作即可。

【总结】

更多干货关注唐老师