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

3D 拾取与交互系统

3D 拾取交互完成。下一课做 3D 敌人 AI。

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

🎯本节学习目标

  • 实现射线交互
  • 实现拾取扔放
  • 实现通用交互

🚀课程导读

“按 E 拿起箱子”“照准门按 F 开”——3D 游戏交互的核心是“准星+射线+按键”。本课做通用交互系统。

准星射线交互

看哪、指哪、按哪。

  1. 【准星】UI 中心小点(Image,第 146 课)。
  2. 【射线】从相机中心发射:
  3. public float range = 5f;
  4. void Update() {
  5. Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0));
  6. RaycastHit hit;
  7. if (Physics.Raycast(ray, out hit, range)) {
  8. if (hit.collider.CompareTag("Interactable")) {
  9. // 显示提示、高亮
  10. ShowPrompt(hit.collider.gameObject);
  11. if (Input.GetKeyDown(KeyCode.E)) hit.collider.SendMessage("OnInteract", SendMessageOptions.DontRequireReceiver);
  12. }
  13. }
  14. }
  15. 【高亮】命中物加轮廓/发光(用 Outline 组件或材质 Emission 变化)。
  16. 【提示】屏幕显示“按 E 开门”(第 169 课)。
  17. 【交互标记】可交互物体 Tag=Interactable + 脚本实现 OnInteract()。
  18. 【发送】SendMessage 或接口(IInteractable)。
  19. 【测试】准星对箱子按 E,触发交互。
  20. 【完成】“看哪按哪”的交互基础。
  21. 【注意】射线范围与 Tag 过滤。
💡
交互 = 准星射线(中心)→ 命中 Interactable → 提示+按键触发。通用套路。

拾取与扔放

拿起来、扔出去。

  1. 【拾取实现】把物体“吸”到相机前:
  2. public Transform holdPoint; // 相机前方挂点
  3. private GameObject heldObj;
  4. void Update() {
  5. if (Input.GetKeyDown(KeyCode.E)) {
  6. if (heldObj == null) PickUp(); else Drop();
  7. }
  8. if (heldObj != null) {
  9. heldObj.transform.position = Vector3.Lerp(heldObj.transform.position, holdPoint.position, Time.deltaTime * 10f);
  10. }
  11. }
  12. void PickUp() {
  13. // 射线命中可拾取物
  14. heldObj = hit.collider.gameObject;
  15. heldObj.GetComponent<Rigidbody>().isKinematic = true; // 关物理
  16. heldObj.transform.SetParent(holdPoint);
  17. }
  18. void Drop() {
  19. heldObj.GetComponent<Rigidbody>().isKinematic = false;
  20. heldObj.transform.SetParent(null);
  21. heldObj = null;
  22. }
  23. 【说明】拾取=关刚体+挂到挂点;放下=开刚体+解除父子。
  24. 【扔】Drop 时 AddForce 往前扔。
  25. 【优化】挂点位置在相机前 1.5 米。
  26. 【注意】拾取物加可拾取 Tag/脚本标记。
  27. 【测试】E 拾起箱子、移动拿着、E 放下/扔出。
  28. 【完成】“拿得起放得下”!
拾取 = isKinematic 关物理 + 挂父节点 + Lerp 吸过去。核心两步。

常见错误与排查

错误:拾起后物体乱飞?
原因:isKinematic 没关或没解除父子
解决:PickUp 设 isKinematic=true;Drop 设 false 并 SetParent(null)。

动手练习

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

  • 做准星射线交互提示
  • 实现拾取/放下/扔出
  • 做按 E 开门的通用交互

本节小结

3D 拾取交互完成。下一课做 3D 敌人 AI。

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

← 上一课3D 物理进阶(关节与力)