【综合|无类|待修】 [缺封面] Unity的射线检测
发布于
2022-8-22
38
1

您需要 登录 才可以下载或查看,没有账号?注册

x
本帖最后由 张金锋 于 2019-3-1 08:10 编辑

射线检测
射线检测就是从一个点向一个方向或一个点发射一条射线,当有碰撞体的时候就停止会返回碰撞体信息,否则继续沿着这个方向发射。
Unity中射线检测相关的API:
public static bool Raycast(Ray ray, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
public static bool Raycast(Ray ray, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
public static bool Raycast(Vector3 origin, Vector3 direction, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
public static bool Raycast(Vector3 origin, Vector3 direction, out RaycastHit hitInfo, float maxDistance = Mathf.Infinity, int layerMask = DefaultRaycastLayers, QueryTriggerInteraction queryTriggerInteraction = QueryTriggerInteraction.UseGlobal);
Raycast只能检测到物体上有Collider组件的物体。
虽然有4个重载方法,但是参数是类似的。
  • Ray 一条射线,从一个点发射,指向一个方向的射线。有点像我们玩的激光灯。下面两个重载方法的前两个参数origindirection实际上就是用来构造这个射线的。
  • maxDistance 射线的最大检测距离。虽然射线应该是无限长,但是在游戏中需要考虑性能,限定距离后可以减少检测的范围,提高运行效率
  • layerMask 检测的layer,和之前学到的Camera和Light中的Layer设置应该类似。
  • queryTriggerInteraction 这是一个枚举类型,设置是否检测Trigger物体。有三个值:
  • UseGrobal 使用全局的Physics.queriesHitTriggers设置。这个设置可以在Edit › Project Settings › Physics 中Queries Hit Triggers设置。
  • Ignore 忽略Trigger
  • Collide 检测Trigger
除了这些参数,还有一个out参数,是RaycastHit类型的参数,RaycastHit中包含的参数有:
C:/Users/zhangjinfeng/AppData/Local/YNote/data/m13522761269_1@163.com/91cbdd138c1f42dfa3a415a139aa36e0/ffbed65188283e00191b559edf5c2aed.png
  • barycentricCoordinate 检测到三角面的重心坐标
  • collider 射线检测到的collider,这个非常常用,因为能根据collider.gameObject获取到对应GameObject
  • distance 射线发射源与检测到的位置的距离
  • lightmapCoord 检测到位置的光照贴图的uv坐标
  • normal 射线碰撞位置的法线
  • point 射线碰撞位置的世界坐标
  • rigidbody 检测到collider上的rigidbody组件,如果没有则返回null
  • textureCoord 射线碰撞位置的贴图UV坐标
  • textureCoord1 已废弃的属性
  • textureCoord2 射线碰撞位置的贴图UV2坐标
  • transform 射线碰撞物体的transform组件
  • triangleIndex 射线碰撞位置三角面的顺序
layerMask详解
如果你知道Layer的名字,可以通过LayerMask.GetMask()方法获取,注意这个方法可以传入一个或多个string类型参数。
如果你知道Layer的数字,比如Layer9,可以通过移位操作1‹‹9来获取”
检测多个层可以用位或运算。

layerMask用的是标志枚举,所以 得用移位的方法来获取层。
“射线检测其实有很多用处,除了射击的判定,还有:
  • 检测光标位置的三维物体
  • 检测角色前面的物体(自动开门)
  • 从空中向下检测(凹凸不平的地形的瞬移)
  • 测量距离(激光测距)”


还没有设置签名!您可以在此展示你的链接,或者个人主页!

使用道具 举报 登录

回复 <

快来发表你宝贵的意见吧!

张金锋 实名

通过了实名认证的内容创造者

  

主题
9
精华
0
超神
0
扩散
9
微金
186
智慧
0
余额
0
在线时间
1158 小时

长枪 学徒法袍 火元素

快速回复 返回顶部 返回列表