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

Unity使用AddForce实现重力时角色匀速下落无加速度如何解决

问题原因

你写的重力代码存在几个核心错误,共同导致了匀速下落的异常:

  • 力的模式选型错误:ForceMode2D.Impulse是瞬时冲量模式,设计用来处理跳跃、受击这类瞬间生效的力,模拟持续存在的重力应该用持续力模式ForceMode2D.Force。
  • 参数匹配错误:Impulse模式的参数是直接的速度变化量,不需要乘以Time.fixedDeltaTime;Force模式下Unity会自动适配固定时间步,也不需要手动乘时间参数。你给Impulse乘时间步长,导致每帧施加的力数值异常偏小。
  • 物理参数冲突:如果没有关闭Rigidbody2D自带的线性阻尼(Linear Drag),阻尼会产生和速度正相关的反向阻力,当每帧施加的固定力和阻尼阻力平衡时,下落速度就会停止增长,表现为匀速。另外如果你没有把刚体自带的Gravity Scale设为0,还会出现自带重力和手写力叠加的问题,进一步打乱下落手感。
  • 方向存在隐患:你用-transform.up作为重力方向,这个方向是跟随物体自身旋转变化的,一旦角色出现转向、倾斜、击退旋转,重力方向就会偏移,正常平台跳跃游戏重力应该始终沿世界坐标系向下。
修正方案

优先推荐直接使用Unity刚体自带的重力系统,物理计算更稳定,性能更好:

  1. 删掉你写在FixedUpdate里的手动AddForce代码
  2. 选中角色的Rigidbody2D组件,将Linear Drag设为0(空中的水平减速不要靠刚体阻尼实现,单独写水平移动逻辑控制即可,垂直方向带阻尼会直接破坏重力加速效果)
  3. 调整Gravity Scale参数到合适值,空洞骑士类的2D平台跳跃手感一般设为3~5,配合你自己的跳跃力、角色质量参数微调即可。

如果需要自定义重力逻辑(比如实现下落加速倍率、滞空调整、变重力区域这类效果),用正确的持续力写法实现,参考代码如下:

public Rigidbody2D rb;
// 重力加速度值,根据手感调整,参考值30~45
public float customGravity = 38f;
// 最大下落速度,避免速度过快穿模,参考值12~18
public float maxFallSpeed = 15f;

void FixedUpdate()
{
    // 重力始终沿世界坐标向下,用Force持续力模式,不需要乘deltaTime
    rb.AddForce(Vector2.down * customGravity, ForceMode2D.Force);
    
    // 钳制最大下落速度
    if (rb.velocity.y < -maxFallSpeed)
    {
        rb.velocity = new Vector2(rb.velocity.x, -maxFallSpeed);
    }
}

注意用自定义重力时,要把Rigidbody2D的Gravity Scale设为0,避免和自带重力叠加。

内容的提问来源于stack exchange,提问作者FreddieStarWars

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 11:54:21