Rigidbody2D.AddForce(ForceMode2D.Impulse)首次触发后仅沿Y轴施力问题
问题分析与修复方案
核心原因
你代码里用了固定的Vector2(1,1)作为爆炸力方向,首次生效但后续仅向上飞,本质是玩家X轴的速度被其他逻辑(比如地面摩擦力、角色移动脚本的速度重置、刚体X轴约束)抵消,导致只有Y轴力生效。另外固定方向也不符合爆炸的物理逻辑——爆炸力应该从爆炸点向外发散。
修复代码
替换固定方向为基于爆炸点与玩家位置差的动态方向,同时优化标签判断逻辑:
public class Knockback : MonoBehaviour { public Rigidbody2D rb; public float expForce; public void OnTriggerEnter2D(Collider2D other) { if (other.CompareTag("Explosion")) { // 计算从爆炸点指向玩家的向外方向(归一化保证力的大小一致) Vector2 pushDirection = (rb.position - (Vector2)other.transform.position).normalized; // 施加冲量式爆炸力 rb.AddForce(pushDirection * expForce, ForceMode2D.Impulse); // 可选:销毁爆炸触发器,避免重复触发 Destroy(other.gameObject); } } }
额外检查项
- 确认玩家Rigidbody2D未勾选
Freeze Position X约束; - 排查角色移动脚本,是否在触发后强制重置了X轴速度;
- 若需要更自然的爆炸效果,可添加随机方向偏移:
Vector2 randomOffset = new Vector2(Random.Range(-0.2f, 0.2f), Random.Range(-0.1f, 0.1f)); pushDirection += randomOffset; pushDirection = pushDirection.normalized;
内容的提问来源于stack exchange,提问作者ashton pulido
相关产品推荐
相关产品推荐

