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
相关产品推荐
相关产品推荐

