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

爆炸与冲击力

爆炸已实现。下一课学重力调节与自定义重力。

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

🎯本节学习目标

  • 掌握 AddExplosionForce
  • 实现范围冲击
  • 结合伤害系统

🚀课程导读

炸弹爆炸要有视觉冲击:范围内物体被炸飞、扣血、冒烟。本课实现物理冲击。

AddExplosionForce 基础

Unity 内置的爆炸力。

  1. 语法:rb.AddExplosionForce(power, 爆炸中心, 半径, 上升力, ForceMode);
  2. 参数:power(力量)、explosionPosition(爆炸中心点)、radius(影响半径)、upwardsModifier(向上加成)、mode(默认 Impulse)。
  3. 只对“带刚体且在半径内”的物体生效。
  4. 【作用】半径内刚体被“炸开”,距离越近力量越大(线性衰减)。
  5. 【upwardsModifier】让物体被炸得“向上飞”而不是纯水平飞。
  6. 【调用位置】在爆炸逻辑处调用(每帧一次或触发时一次)。
  7. 【注意】需要遍历半径内所有刚体,配合 OverlapSphere(第 102 课)。
💡
AddExplosionForce 自动按距离衰减,一个调用解决“爆炸冲击”。

实战:完整爆炸

爆炸 = 冲击 + 伤害 + 特效。

  1. 创建脚本 Explosion,挂到炸弹/手雷上:
  2. public float radius = 5f; public float power = 500f; public float damage = 50f;
  3. void Explode() {
  4. Vector3 center = transform.position;
  5. Collider[] cols = Physics.OverlapSphere(center, radius);
  6. foreach (Collider c in cols) {
  7. Rigidbody rb = c.attachedRigidbody;
  8. if (rb != null) { rb.AddExplosionForce(power, center, radius, 3f); }
  9. IDamageable d = c.GetComponent<IDamageable>(); if (d != null) { d.TakeDamage(damage); }
  10. }
  11. Instantiate(effectPrefab, center, Quaternion.identity); // 爆炸特效
  12. Destroy(gameObject); // 炸弹消失
  13. }
  14. 【触发】在 OnTriggerEnter 里调用 Explode()(引信),或延时协程。
  15. 【特效】把粒子爆炸特效做成预制体(第 191 课)。
  16. 【伤害】用 IDamageable 接口(第 68 课)让所有可受伤对象响应。
  17. 【注意】特效预制体要延迟销毁,避免永久残留。
爆炸公式 = OverlapSphere 找目标 + AddExplosionForce 冲击 + 接口伤害 + 特效预制体。

常见错误与排查

错误:物体没被炸飞?
原因:物体无刚体,或 power 太小,或半径不对
解决:确认目标带刚体;调大 power(如 800);确认 radius 覆盖目标。

动手练习

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

  • 实现带冲击的爆炸
  • 用接口让敌人被爆炸扣血
  • 在爆炸点生成粒子特效

本节小结

爆炸已实现。下一课学重力调节与自定义重力。

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

← 上一课拖拽物体(鼠标拖拽 3D 物体)