首页/ 第 14 章 · 3D 游戏进阶/ 第 248 课
LESSON 248 · 3D 游戏进阶

3D 光线投射与拾取进阶

射线进阶完成。下一课 3D 章综合练习:完整小型 3D 游戏。

⏱ 约 13 分钟📊 难度:入门🗂 第 14 章 · 3D 游戏进阶📍 第 248 / 300 课
课程进度
248 / 300

🎯本节学习目标

  • 掌握射线进阶
  • 实现交互接口
  • 实现多层检测

🚀课程导读

把第 234 课的交互升级为”工程级“:用接口解耦、用 Layer 过滤、射线可视化。

交互接口 IInteractable

谁都能被交互。

  1. 【接口】定义统一交互入口:
  2. public interface IInteractable {
  3. void OnInteract(GameObject interactor);
  4. string GetPrompt();
  5. }
  6. 【实现】任何物体实现接口即可被交互:
  7. public class Door : MonoBehaviour, IInteractable {
  8. public void OnInteract(GameObject interactor) { Open(); }
  9. public string GetPrompt() => "按 E 开门";
  10. }
  11. 【交互器】玩家脚本统一处理:
  12. if (Physics.Raycast(ray, out hit, range, interactMask)) {
  13. IInteractable interactable = hit.collider.GetComponent<IInteractable>();
  14. if (interactable != null) {
  15. promptText.text = interactable.GetPrompt();
  16. if (Input.GetKeyDown(KeyCode.E)) interactable.OnInteract(gameObject);
  17. }
  18. }
  19. 【优势】新交互物只需实现接口,无需改玩家脚本(开闭原则)。
  20. 【提示】接口让提示文字也由物体自己提供。
  21. 【测试】门、箱子、NPC 都实现接口,一个交互器全搞定。
  22. 【完成】交互”工程化“!
  23. 【注意】GetComponent<IInteractable>() 需 using System.
💡
交互接口 = 玩家只管”找 IInteractable 并调用“,物体自己实现。解耦神器。

射线进阶技巧

可视化与多层。

  1. 【可视化】Scene 视图画射线:Debug.DrawRay(ray.origin, ray.direction * range, Color.green);
  2. 【调试】射线没命中时检查方向/距离/层。
  3. 【Layer 过滤】int mask = 1 << LayerMask.NameToLayer("Interactable");
  4. 【多层】一次检测多个层:mask = mask1 | mask2;
  5. 【忽略自身】命中自己的碰撞体:跳过 hit.collider.gameObject == gameObject。
  6. 【掩码层】用 LayerMask.GetMask("Ground", "Enemy")。
  7. 【持久】射线方向随相机旋转:用相机 forward 而非固定。
  8. 【帧率】每帧一条射线开销极小;批量用 Physics.RaycastAll 或批处理。
  9. 【命中所有】RaycastAll 一次拿所有命中(穿透检测,进阶)。
  10. 【完成】射线”专业“了!
  11. 【测试】把交互系统的射线可视化确认命中范围。
射线进阶 = 接口解耦 + Layer 过滤 + Debug.DrawRay 可视化。排查效率翻倍。

常见错误与排查

错误:射线没命中该命中的?
原因:Layer 过滤掉了或方向不对
解决:检查 LayerMask 是否包含目标层;用 Debug.DrawRay 看射线。

动手练习

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

  • 定义 IInteractable 接口并让门实现
  • 玩家统一处理交互
  • 可视化射线调试

本节小结

射线进阶完成。下一课 3D 章综合练习:完整小型 3D 游戏。

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

← 上一课3D 交互界面(HUD 与互动 UI)