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

Unity中左右移动时rb.velocity.y数值异常问题求助

Unity玩家移动时重力异常问题修复

问题根源

  1. 物理引擎微小扰动:移动时地面碰撞或摩擦可能产生极小的rb.velocity.y数值,触发重力scale的分支判断。
  2. 输入判断时机错误:FixedUpdate中使用Input.GetKeyDown不可靠,且未限制重力调整仅在空中跳跃阶段生效。
  3. 地面检测与重力重置未绑定:地面状态下未强制恢复默认重力,导致微小速度误触发重力修改。

具体修复代码及说明

// 定义阈值过滤物理引擎的微小速度抖动
private float velocityYThreshold = 0.01f;

void FixedUpdate(){
    // 优化地面检测,用OverlapBox更稳定(也可保留原BoxCast,微调参数)
    isGrounded = Physics2D.OverlapBox(
        coll.bounds.center - new Vector3(0, coll.bounds.extents.y + 0.05f, 0),
        new Vector2(coll.bounds.size.x, 0.1f),
        0f,
        WhatIsGround
    );

    rb.velocity = new Vector2(moveInput * speed, rb.velocity.y);

    if(jumped){
        rb.AddForce(Vector2.up * jump, ForceMode2D.Impulse);
        jumped = false;
    }

    // 仅在空中时调整重力,地面强制恢复默认
    if(!isGrounded){
        // 过滤极小的y速度,避免误触发
        if(Mathf.Abs(rb.velocity.y) > velocityYThreshold){
            if(rb.velocity.y < 0){
                // 下落阶段应用下落重力乘数
                rb.gravityScale = fallMultiplier;
            }
            else if(!Input.GetKey(KeyCode.Space) && !Input.GetKey(KeyCode.UpArrow)){
                // 上升阶段未按住跳跃键,应用低跳重力乘数
                rb.gravityScale = lowJumpMultiplier;
            }
            else{
                // 上升阶段按住跳跃键,保持默认重力
                rb.gravityScale = 1f;
            }
        }
        else{
            rb.gravityScale = 1f;
        }
    }
    else{
        // 地面状态下强制重置重力
        rb.gravityScale = 1f;
    }
}

关键修复点说明

  • 速度阈值过滤:用Mathf.Abs(rb.velocity.y) > velocityYThreshold忽略物理引擎产生的微小抖动,避免误触发重力修改。
  • 绑定地面状态:地面状态下强制设置gravityScale = 1f,确保移动时重力不会异常变化。
  • 修正输入判断:将Input.GetKeyDown改为Input.GetKey,适配FixedUpdate的帧率特性,准确检测跳跃键是否持续按住。
  • 优化地面检测:用OverlapBox替代BoxCast(可选),地面检测更稳定,减少isGrounded的误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 10:35:22