Unity实用功能之射线检测详解

摘自 稀土掘金Unity实用功能之射线检测详解__Mr_Wen
(自己当笔记使用)

在官方API中,我们会发现Ray是一个结构体()

以上是官方API中的一部分内容,但是Ray不可能只有这么点功能,其实还有许多应用,别比如说,直接从相机发射射线,射线检测返回碰撞信息等。

Ray Camera.main.ScreenPointToRay(Vector3 pos)   返回一条射线Ray从摄像机到屏幕指定一个点
Ray Camera.main.ViewportPointToRay(Vector3 pos)  返回一条射线Ray从摄像机到视口(视口之外无效)指定一个点
RaycastHit 射线检测返回射线的碰撞信息
bool Physics.Raycast 射线是否与物体发生的碰撞器发生碰撞,发生碰撞为true
RaycastHit[] RaycastAll 射线检测并返回所有碰撞,也就是射线检测并返回一个RaycastHit[]结构体。

Camera.main.ScreenPointToRay和Camera.main.ViewportPointToRay
这两个射线检测跟好理解,直接就是以摄像机为起始,然后发射一条射线,其中的参数Vector3 pos就是射线要发射的方向。
一般常用的是向鼠标点击的位置发射一条射线,多用于射击等游戏
Camera.main.ScreenPointToRay(Input.mousePosition);//从摄像机发出一条射线,到点击的坐标

RaycastHit和bool Physics.Raycast
在项目中,只发射一条射线还不行,发射射线了,我们还要知道,射线碰撞到了什么物体,所以就用到了Physics.Raycast

一般常用的为前三个,让我们一起来看一下其中的参数

Ray ray:我们上面创建射线
out RaycastHit hitInfo:返回的碰撞信息(可以得到transform,rigidbody,point等信息。)
float maxDistance:射线的最大长度是多长
int layerMask:只选定Layermask层内的碰撞器,其它层内碰撞器忽略。 选择性的碰撞

其中int layerMask参数还是比较有意思的,让我们一起来看一下。
layerMask就是设置一下射线检测的层级,在Unity中每个GameObject都会有一个Layer,这里的检测层级就是指检测Layer中的某一层或是某几层,其他的物体Layer不是设置的要检测的层,将不会被射线检测,射线将会直接穿透过去。
layerMask其实很简单,大概分为四种表达方式:

1 << 10  只检测第10的层。
~(1 << 10) 检测除了第10之外的层。
~(1 << 0) 检测所有的层(也可以不填参数,就默认检测所有)。
(1 << 10) | (1 << 8) 检测第10和第8的层。

DrawLine
Debug.DrawLine是untiy中在Scene视图花线条的方法,常用的方法如下,此方法是画出一条射线多配合射线检测Debugshiyong ,此功能仅能用在Scene视图中

public static void DrawLine(Vector3 start, Vector3 end, Color color, float duration);

start:线条的起始点
end:线条的终点
color:线条的颜色
duration:线条存在的时间

作者:Mr_Wen
链接:https://juejin.cn/post/6995923760473702431
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

posted @ 2022-06-07 13:40  专心Coding的程侠  阅读(1141)  评论(0编辑  收藏  举报