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

