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

3D 射击系统

3D 射击完成。下一课做投掷物。

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

🎯本节学习目标

  • 实现射线射击
  • 实现伤害判定
  • 实现命中反馈

🚀课程导读

3D 射击的“打没打中”用射线判定(即时命中)。本课做完整的射击与反馈。

射线射击(Raycast)

准星到命中点。

  1. 【思路】从准星发一条射线,命中的地方=着弹点(即时命中,无需子弹)。
  2. 【脚本 Gun】
  3. public float range = 100f; public LayerMask hitMask;
  4. public Transform firePoint;
  5. void Update() {
  6. if (Input.GetMouseButtonDown(0)) Fire();
  7. }
  8. void Fire() {
  9. Ray ray = Camera.main.ScreenPointToRay(new Vector3(Screen.width/2, Screen.height/2, 0));
  10. RaycastHit hit;
  11. if (Physics.Raycast(ray, out hit, range, hitMask)) {
  12. // 命中伤害
  13. Enemy enemy = hit.collider.GetComponent<Enemy>();
  14. if (enemy != null) enemy.TakeDamage(20);
  15. // 弹孔/火花特效
  16. Instantiate(bulletHole, hit.point, Quaternion.LookRotation(hit.normal));
  17. }
  18. // 枪口火光+音效
  19. muzzleFlash.Play(); AudioManager.Instance.PlaySFX(shootSound);
  20. }
  21. 【命中】hit.point 着弹点、hit.normal 法线(弹孔贴墙方向)。
  22. 【射速】冷却控制(第 214 课)。
  23. 【散射】(进阶)命中点加随机偏移模拟后坐力。
  24. 【测试】准星射敌人扣血、墙上留弹孔。
  25. 【注意】hitMask 过滤只打敌人/墙壁。
  26. 【完成】“能打中”了!
💡
3D 射击 = 准星射线 + 命中伤害 + 弹孔特效。一套三样。

伤害与反馈

让“打中”有反馈。

  1. 【伤害接口】Enemy 脚本:
  2. public int hp = 100;
  3. public void TakeDamage(int dmg) {
  4. hp -= dmg;
  5. // 受击反馈:闪红/粒子/音效
  6. StartCoroutine(FlashRed());
  7. if (hp <= 0) Die();
  8. }
  9. 【受击闪红】材质变色 0.1s 恢复(协程)。
  10. 【死亡】Die():播死亡动画/特效、加分数、销毁。
  11. 【命中 UI】准星变红/命中标记(可选)。
  12. 【音效】命中 vs 未命中不同音效。
  13. 【击退】命中间歇 AddForce(物理反馈)。
  14. 【伤害数值】(进阶)飘字“20”(世界空间 TextMesh 弹出上升)。
  15. 【头部判定】(进阶)多层碰撞区分部位伤害。
  16. 【测试】打敌人有反馈、死亡正常。
  17. 【注意】死亡后防止重复受伤(isDead 标记)。
  18. 【完成】射击“手感”出来了!
命中反馈五件套:闪红、粒子、音效、飘字、击退。反馈齐手感妙。

常见错误与排查

错误:打不中敌人?
原因:LayerMask 过滤或敌人没碰撞体
解决:确认敌人有 Collider 且在 hitMask 层;射线从相机中心出。

动手练习

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

  • 实现射线射击与伤害
  • 加弹孔与受击反馈
  • 实现死亡与计分

本节小结

3D 射击完成。下一课做投掷物。

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

← 上一课3D 敌人与 AI 导航