Unity使用AddForce实现重力时角色匀速下落无加速度如何解决
问题原因
你写的重力代码存在几个核心错误,共同导致了匀速下落的异常:
- 力的模式选型错误:
ForceMode2D.Impulse是瞬时冲量模式,设计用来处理跳跃、受击这类瞬间生效的力,模拟持续存在的重力应该用持续力模式ForceMode2D.Force。 - 参数匹配错误:
Impulse模式的参数是直接的速度变化量,不需要乘以Time.fixedDeltaTime;Force模式下Unity会自动适配固定时间步,也不需要手动乘时间参数。你给Impulse乘时间步长,导致每帧施加的力数值异常偏小。 - 物理参数冲突:如果没有关闭Rigidbody2D自带的线性阻尼(Linear Drag),阻尼会产生和速度正相关的反向阻力,当每帧施加的固定力和阻尼阻力平衡时,下落速度就会停止增长,表现为匀速。另外如果你没有把刚体自带的
Gravity Scale设为0,还会出现自带重力和手写力叠加的问题,进一步打乱下落手感。 - 方向存在隐患:你用
-transform.up作为重力方向,这个方向是跟随物体自身旋转变化的,一旦角色出现转向、倾斜、击退旋转,重力方向就会偏移,正常平台跳跃游戏重力应该始终沿世界坐标系向下。
修正方案
优先推荐直接使用Unity刚体自带的重力系统,物理计算更稳定,性能更好:
- 删掉你写在FixedUpdate里的手动AddForce代码
- 选中角色的Rigidbody2D组件,将
Linear Drag设为0(空中的水平减速不要靠刚体阻尼实现,单独写水平移动逻辑控制即可,垂直方向带阻尼会直接破坏重力加速效果) - 调整
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
相关产品推荐
相关产品推荐

