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

Unity开发中如何关闭角色停止移动时的惯性效果?

问题原因及解决方案
  • 你使用的Input.GetAxis()默认带有输入平滑插值,松开按键后输入值不会立刻归零,而是会在0.1~0.5秒左右逐步降到0,这是导致角色滑行的核心原因
  • 你的代码中对刚体velocity赋值时错误乘以了Time.deltaTime:velocity本身代表单位时间的移动速度,不需要乘时间增量,这会导致你设置的移动速度远低于预期,输入平滑的影响被放大
  • mass(质量)参数只影响受力后的加速度表现,直接修改velocity时质量不会产生任何影响;drag momentum(角阻力)仅控制旋转减速效果,和平动滑行无关

解决方案步骤

步骤1:替换为无平滑的输入接口

把Input.GetAxis()替换为Input.GetAxisRaw(),该接口不会做输入平滑处理,松开按键后输入值会立刻变为0

步骤2:修正velocity赋值逻辑

移除velocity赋值时的Time.deltaTime参数,仅保留速度系数即可

步骤3:添加零输入时强制清零逻辑

如果需要更彻底的立刻停止效果,当输入向量大小接近0时直接把刚体速度强制设为0

修正后代码示例

public class CapsuleMovement : MonoBehaviour
{
    Rigidbody rb;
    Vector3 playerMovement;
    [SerializeField] float speed = 5; // 原speed乘了Time.deltaTime所以设置数值偏大,修正后可调整到合理范围
    
    void Start()
    {
        rb = GetComponent<Rigidbody>();
    }

    void FixedUpdate()
    {
        ProccessCapsuleMovement();
    }

    void ProccessCapsuleMovement () 
    {
        // 使用GetAxisRaw获取无平滑的输入值
        playerMovement = new Vector3 (Input.GetAxisRaw("Horizontal"), 0, Input.GetAxisRaw("Vertical"));
        
        // 输入为0时直接清零速度,彻底避免滑行
        if (playerMovement.magnitude < 0.01f)
        {
            rb.velocity = Vector3.zero;
            return;
        }
        
        playerMovement.Normalize();
        // 移除Time.deltaTime,velocity本身是单位时间速度
        rb.velocity = playerMovement * speed;
    }
}

附加排查项

如果修改后仍有滑行问题可依次检查:

  • 刚体组件的Constraints设置,确认没有误冻结位置轴
  • 场景中是否有其他物理相关脚本同时修改该刚体的速度或施加外力
  • 检查Edit->Project Settings->Input Manager中Horizontal和Vertical轴的Gravity参数,调大该参数也能加快输入归零速度

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 10:06:04