Unity中射线检测有多种 API.Unity Documentation描述中的两种:
| RaycastAll | Casts a ray through the Scene and returns all hits. Note that order is not guaranteed. |
| RaycastNonAlloc | Cast a ray through the Scene and store the hits into the buffer. |
RaycastAll:返回所有的碰撞,但无法保证顺序。有GC。
RaycastNonAlloc :返回的是满足射线检测条件的碰撞个数,用一个 RaycastHit[] 数组来保存碰撞信息。无GC。且部分有序。官方没说明。
既然无GC,有序,可以返回所有的碰撞,那么就很完美的取代了RaycastAll。
使用 RaycastNonAlloc 最重要的就是RaycastHit[] 这个参数。
一、 需要为RaycastHit[] 数组开辟一个足够大的长度。
足够大,意味着需要提前设想会有最大的满足条件的射线检测条件的个数。一次初始化,后面复用,也是减少频繁开辟数组内存的合理用法。
二、返回的个数是[0, 数组长度]的闭区间
- 假设申请的数组长度是10。满足射线检测条件的信息个数是5个,那么返回的就是5。这五个信息会在数组的0下标开始依次存储。
- 假设申请的数组长度是5。满足射线检测条件的信息个数是10个,那么返回的就是5。这五个信息会在数组的0下标开始依次存储。
三、返回的碰撞信息是“有限有序”的
RaycastHit[] 数组中的信息,在某些方向的检测条件下是按照离检测原点 由近到远的距离来存储的。
在测试过程中发现,只有当射线方向为Vector3.down、Vector3.back,Vector3.left 时候,得到的结果是有序的。
在二.2中的情况时,数组中存在的是距离检测原点最近的5个碰撞信息,且从近到远存储。
四、RaycastHit[] 只会对本次射线检测到的碰撞存储
假设申请的数组长度是10,第一次射线检测到10个碰撞。数组中存储了本次射线检测的所有的碰撞信息。
当我们在进行第二次射线检测的时候,满足条件的只有5个。此时,数组中前5个是本次射线检测的碰撞信息,而数组的后5个,还保留着上次的射线检测结果。所以,我们应该根据返回的个数来对数组进行遍历。