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

Unity中停止速度的代码为何失效?添加else if后角色无法移动

问题分析与修复

核心问题1:时间步参数错误

你在Update方法里误用了Time.fixedDeltaTime,这个参数是给**FixedUpdate(物理更新帧)**使用的,Update的时间步应该用Time.deltaTime。用错参数会导致移动速度被大幅缩小,看起来像完全没动。

核心问题2:逻辑分支设计不合理

Input.GetKeyUp(KeyCode.D)只会在松开D键的那一帧触发,用else if和Input.GetKey绑定后,无法覆盖“既没按住也没松开D键”的常规状态。要实现“松开后停止滑动”的需求,直接用else分支处理所有“未按住D键”的情况更稳妥,每帧都会检查,避免遗漏。

修正后的代码

void Update()
{
    if (Input.GetKey(KeyCode.D))
    {
        // Update用Time.deltaTime,确保移动速度和帧率无关
        rigidbody.velocity = new Vector2(speed * Time.deltaTime, rigidbody.velocity.y);
    }
    else
    {
        // 未按住D键时,重置水平速度防止滑动
        rigidbody.velocity = new Vector2(0, rigidbody.velocity.y);
    }
}

额外优化建议

  • 变量名Rigidbody应小写开头(rigidbody),符合C#命名规范;新版本Unity建议提前获取刚体组件引用(你用Vector2应该是2D刚体):
    private Rigidbody2D rb;
    
    void Start()
    {
        rb = GetComponent<Rigidbody2D>();
    }
    
    void Update()
    {
        if (Input.GetKey(KeyCode.D))
        {
            rb.velocity = new Vector2(speed * Time.deltaTime, rb.velocity.y);
        }
        else
        {
            rb.velocity = new Vector2(0, rb.velocity.y);
        }
    }
    
  • 如果是3D项目,把Rigidbody2D换成Rigidbody,Vector2换成Vector3即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 01:13:20