You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 12:40:53