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

Unity3D:Rigidbody重力启停方法及重启后下落过快的修复方案

Unity3D中Rigidbody重力的禁用/启用及异常问题解决

基础的重力禁用与启用方法

直接修改Rigidbody的useGravity属性即可实现单个刚体的重力开关:

  • 禁用重力:
Rigidbody rb = GetComponent<Rigidbody>();
rb.useGravity = false;
  • 启用重力:
rb.useGravity = true;

但直接启用重力时,常会出现物体瞬间下落速度过快的问题——这是因为Unity物理引擎在useGravity=false期间,不会施加重力加速度,但重新启用时,会补算这段时间内重力本该产生的速度累积,导致物体仿佛“补上了禁用期间没下落的距离”。

解决速度异常的几种方案

方案1:启用重力时重置垂直方向速度

适合不需要保留禁用重力期间垂直速度的场景,直接清零垂直方向的速度,避免累积的异常速度:

rb.useGravity = true;
// 假设Y轴为垂直方向,按需修改轴方向
Vector3 adjustedVelocity = rb.velocity;
adjustedVelocity.y = 0;
rb.velocity = adjustedVelocity;

方案2:禁用重力时冻结位置/速度

如果希望物体在禁用重力时保持静止,可同时冻结垂直位置或速度,启用时再解除:

  • 禁用重力时:
rb.useGravity = false;
// 冻结垂直位置,防止物体因其他力移动
rb.constraints |= RigidbodyConstraints.FreezePositionY;
// 或者直接清零速度
// rb.velocity = Vector3.zero;
  • 启用重力时:
rb.useGravity = true;
// 解除垂直位置冻结
rb.constraints &= ~RigidbodyConstraints.FreezePositionY;

方案3:手动模拟重力(完全自定义控制)

关闭useGravity,在FixedUpdate中手动施加重力,完全掌控重力的施加时机,避免引擎自动补算:

private Rigidbody _rb;
public bool gravityEnabled = true;
public float gravityScale = 1f;

void Awake()
{
    _rb = GetComponent<Rigidbody>();
    _rb.useGravity = false; // 关闭内置重力
}

void FixedUpdate()
{
    if (gravityEnabled)
    {
        // 使用全局重力值,按比例施加
        _rb.AddForce(Physics.gravity * gravityScale, ForceMode.Acceleration);
    }
}

// 调用此方法禁用重力
public void TurnOffGravity()
{
    gravityEnabled = false;
}

// 调用此方法启用重力
public void TurnOnGravity()
{
    gravityEnabled = true;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 22:30:44