首页/ 第 7 章 · 物理系统/ 第 101 课
LESSON 101 · 物理系统

射线检测进阶:图层过滤与命中信息

射线进阶已掌握。下一课学物理查询与抛体运动。

⏱ 约 14 分钟📊 难度:入门🗂 第 7 章 · 物理系统📍 第 101 / 300 课
课程进度
101 / 300

🎯本节学习目标

  • 掌握 LayerMask 过滤
  • 掌握 RaycastHit 详细信息
  • 掌握多条射线与数组查询

🚀课程导读

上节课学会了基本射线,本课把它的“全身功能”挖掘出来:只打指定层、读取命中点与法线。

Raycast 完整参数

一行代码看全部能力。

  1. 完整语法:Physics.Raycast(origin, direction, out hit, maxDistance, layerMask, queryTriggerInteraction);
  2. 参数逐一说明:
  3. ① origin 起点(Vector3)
  4. ② direction 方向(单位向量)
  5. ③ out hit 命中信息(RaycastHit)
  6. ④ maxDistance 最大检测距离
  7. ⑤ layerMask 只检测的层(位掩码,第 99 课)
  8. ⑥ queryTriggerInteraction:是否检测触发器(Ignore/Query/Collide)
  9. 【简写】多数情况只需前 4 个参数。
  10. 【返回多个】Physics.RaycastAll(ray, distance) 返回所有被射中的物体数组(穿过多个)。
  11. 【最近与最远】RaycastAll 后按 hit.distance 排序即可。
  12. 【球形射线】Physics.SphereCast:带“粗细”的射线(有半径),更真实。
  13. 【性能】每条射线是一次物理查询,避免每帧成千上万条。
💡
射线默认不检测触发器(勾了 Is Trigger 的),需要时用第 6 个参数开启。

RaycastHit 命中信息实战

用命中点与法线做特效。

  1. 新建脚本 RayAdvDemo:
  2. if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 10f)) {
  3. Debug.Log("名字:" + hit.collider.name);
  4. Debug.Log("命中点:" + hit.point);
  5. Debug.Log("法线:" + hit.normal);
  6. Debug.Log("距离:" + hit.distance);
  7. Debug.Log("刚体:" + hit.rigidbody);
  8. Debug.DrawLine(transform.position, hit.point, Color.green); // 画线到命中点
  9. }
  10. 【命中点 hit.point】在击中位置生成特效:Instantiate(effectPrefab, hit.point, Quaternion.LookRotation(hit.normal));
  11. 【法线 hit.normal】让特效“贴”在被击表面(垂直方向)。
  12. 【距离 hit.distance】判断远近做伤害衰减。
  13. 【刚体 hit.rigidbody】对被击中物体施加力:hit.rigidbody.AddForce(...)。
  14. 【常用组合】射击命中:命中点生成火花 + 对被击刚体加力 + 扣血。
RaycastHit 三宝:hit.point(在哪)、hit.normal(朝向)、hit.rigidbody(打的是谁)。

常见错误与排查

错误:射线穿过物体却没检测到?
原因:LayerMask 未包含该层,或对象是触发器
解决:检查 LayerMask;用 queryTriggerInteraction 开启触发器检测。

动手练习

课后小任务(做出来才算真的学会)

  • 用 RaycastAll 返回所有命中物体
  • 在命中点生成一个小特效
  • 对被击中的刚体施加 Impulse 力

本节小结

射线进阶已掌握。下一课学物理查询与抛体运动。

完成打卡后,主站会实时更新你的学习进度 🎯

← 上一课射线检测 Raycast 入门