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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 05:36:02