如何在Unity中用C#实现按住W键移动物体、松开后平滑停止
问题分析
你现有代码存在两个核心问题,无法实现预期效果:
- 你使用的
Input.GetKeyDown仅在按键按下的第一帧触发,按住W的过程中不会持续给刚体施加推力,物体根本不会持续移动 - 没有松开按键后的主动减速逻辑,物体仅能受刚体默认阻力自然减速,无法控制平滑停止的效果
修改后可直接运行的代码
using UnityEngine; public class Car : MonoBehaviour { public Rigidbody rb; [Header("移动参数")] public float moveForce = 1500f; // 前进推力,可根据需求调整 public float decelerationDamping = 5f; // 减速阻尼,数值越大停止越快 public float maxSpeed = 10f; // 最大前进速度,避免失控 void FixedUpdate() { // 物理逻辑统一放在FixedUpdate执行,避免帧率波动导致卡顿 if (Input.GetKey(KeyCode.W)) { // 按住W时持续施加推力,同时限制最大速度 if (rb.velocity.magnitude < maxSpeed) { rb.AddForce(transform.forward * moveForce * Time.fixedDeltaTime); } } else { // 松开W时平滑衰减速度 rb.velocity = Vector3.Lerp(rb.velocity, Vector3.zero, decelerationDamping * Time.fixedDeltaTime); // 当速度足够小时直接设为0,避免刚体抖动 if (rb.velocity.magnitude < 0.1f) { rb.velocity = Vector3.zero; } } } }
关键调整说明
- 输入检测改为
Input.GetKey(KeyCode.W),实现按住W期间持续触发推力施加逻辑 - 所有物理相关的操作统一放在
FixedUpdate中执行,适配Unity物理更新的频率,避免移动出现卡顿跳帧 - 松开W时通过
Vector3.Lerp对刚体速度做平滑插值衰减,调整decelerationDamping参数即可自定义停止的平滑程度 - 增加了最大速度限制,避免物体持续加速导致速度失控
- 额外增加了极小速度下直接置零的逻辑,避免速度接近0时刚体出现微小抖动的问题
额外注意
如果测试时发现推力太小推不动物体,可以适当调大moveForce参数,也可以把Rigidbody组件的Drag值设为0,完全由代码控制减速效果会更可控。
内容的提问来源于stack exchange,提问作者Ali Farman
相关产品推荐
相关产品推荐

