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

射线检测 Raycast 入门

Raycast 已入门。下一课进阶:射线过滤、命中信息与物理查询。

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

🎯本节学习目标

  • 理解射线的概念
  • 掌握 Raycast 语法
  • 实现点击拾取与前方探测

🚀课程导读

“鼠标点中了哪个物体?”“前方 3 米有没有墙?”——射线(Ray)是 Unity 里“用线检测”的利器,应用极广。

射线基础

“一根看不见的激光笔”。

  1. 射线 = 从某个点向某个方向发射的“无限长/有限长的线”,检测它穿过了什么。
  2. 语法:Physics.Raycast(起点, 方向, out 命中信息, 最大距离);
  3. 【返回】bool:是否命中。true=有物体被射中。
  4. 【命中信息 out hit】RaycastHit hit:包含命中的碰撞体、点、法线、距离。
  5. 【方向】用单位向量(normalized)表示方向。
  6. 【最简写法】
  7. if (Physics.Raycast(transform.position, transform.forward, out RaycastHit hit, 10f)) { Debug.Log("射中:" + hit.collider.name); }
  8. 【LayerMask 过滤】加第 5 参数:Physics.Raycast(..., mask) 只检测指定层。
  9. 【可视调试】Debug.DrawRay(起点, 方向 * 距离, Color.red); 在场景里画出射线。
  10. 【适用】射击命中检测、点击物体、前方障碍检测、视线检测。
💡
Debug.DrawRay 是调试射线的必备,先画出来再调逻辑,事半功倍。

实战:点击拾取物体

鼠标点中哪个就打印哪个。

  1. 新建脚本 RayDemo 挂到 Camera(或空对象)上。
  2. 在 Update 里写:
  3. if (Input.GetMouseButtonDown(0)) {
  4. Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition); // 屏幕点转射线
  5. if (Physics.Raycast(ray, out RaycastHit hit, 100f)) { Debug.Log("点击了:" + hit.collider.name); }
  6. }
  7. 【解释】ScreenPointToRay 把鼠标屏幕坐标转成从相机发出的世界射线。
  8. 播放:用鼠标点击场景里的各个物体,Console 输出被点中的名字。
  9. 【进阶】根据名字/标签做不同响应:点击敌人扣血、点击金币收集。
  10. 【前方探测】transform.forward 方向 Raycast,检测前方是否有墙/敌人(AI 用)。
  11. 【注意】被点物体需要有碰撞体,射线才能命中。
“屏幕坐标 → 射线 → 命中对象”是“点击游戏”的标准套路,务必熟练。

常见错误与排查

错误:点击没有反应?
原因:物体无碰撞体、或射线方向错误、或 Camera.main 为 null
解决:确认物体有碰撞体;确认用了 ScreenPointToRay;确认相机 Tag 是 MainCamera。

动手练习

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

  • 实现鼠标点击打印物体名
  • 用 forward 射线检测前方 5 米是否有障碍
  • 用 Debug.DrawRay 可视化射线

本节小结

Raycast 已入门。下一课进阶:射线过滤、命中信息与物理查询。

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

← 上一课物理层 Layer 碰撞矩阵