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

Unity 2D横版游戏Rigidbody2D移动时Y轴被覆写为0重力失效如何解决

你出现这个问题的根本原因是对Rigidbody2D.MovePosition()的作用逻辑理解有误:该方法会直接强制修改刚体的下一帧位置,你原来的代码里位移的Y分量写死为0,相当于抵消了重力每帧给刚体叠加的Y轴下落位移,自然会锁死Y坐标导致重力失效。
而你尝试把0替换为rb.Velocity.y后逻辑依旧错误:rb.Velocity.y的单位是米/秒,你直接把速度值当成位移量加到位置上,单位都不匹配,物理运算自然会出现异常表现。

方案1:通过修改速度控制移动(推荐)

这是2D横版游戏最常用的移动实现方式,只会修改水平方向速度,垂直方向速度完全交给Unity物理系统处理,重力、跳跃效果都不会受影响:

public void MoveCharacter(float directionHori) //输入值为-1或1
{      
    // 仅修改X轴速度,Y轴保留刚体原有速度(重力会自动更新该值)
    rb.velocity = new Vector2(directionHori * moveSpeed, rb.velocity.y);
}

方案2:坚持使用MovePosition的修正写法

如果你有特殊需求必须用MovePosition()实现移动,需要主动补全重力带来的Y轴位移量:

public void MoveCharacter(float directionHori) //输入值为-1或1
{      
    // X轴用自定义的移动量,Y轴保留重力对应的位移
    Vector2 frameMove = new Vector2(
        directionHori * moveSpeed * Time.fixedDeltaTime,
        rb.velocity.y * Time.fixedDeltaTime
    );
    rb.MovePosition(rb.position + frameMove);
}

注意事项

  • 所有对Rigidbody的操作都要放在FixedUpdate()生命周期中执行,不要放在Update()里,避免出现卡顿、物理表现异常的问题
  • 检查Rigidbody2D组件的配置:Body Type必须设为Dynamic,Gravity Scale不要设为0,不要勾选Constraints里的Freeze Position Y,否则重力会直接失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 06:54:03