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

使用Time.deltaTime后Unity角色移动功能失效问题求助

Unity 2D角色移动问题解决思路

问题根源分析

  1. 无Time.deltaTime时2秒后停止:
    你当前的MoveRight/MoveLeft是单次设置刚体速度,而非持续更新。如果刚体带有Drag(阻力),速度会被逐渐消耗,最终减速到停止;即便Drag为0,单次设置velocity后,若没有后续更新,物理系统也可能因碰撞、其他力影响导致速度丢失。

  2. 加入Time.deltaTime后无法移动:
    rb.velocity的单位是「单位/秒」,本身已是时间相关量。乘以Time.deltaTime(通常为0.01~0.02秒)后,速度会被缩小到几乎可忽略的数值(比如10*0.016=0.16),单次设置后很快被Drag清零,因此看不出移动。

解决方法

方案1:持续更新刚体速度(推荐用于按钮/输入触发的移动)

如果是通过UI按钮按住移动,需确保MoveRight/MoveLeft被持续调用(比如绑定按钮的On Pointer Down事件触发移动,On Pointer Up触发停止),同时移除Time.deltaTime:

public void MoveRight()
{
    // 保留Y轴原有速度,避免影响上下移动
    rb.velocity = new Vector2(moveSpeed, rb.velocity.y);
    Debug.Log("向右移动");
}

public void MoveLeft()
{
    rb.velocity = new Vector2(-moveSpeed, rb.velocity.y);
}

public void StopMoving()
{
    rb.velocity = new Vector2(0, rb.velocity.y);
    Debug.Log("停止移动");
}

如果用键盘输入,更稳定的方式是在FixedUpdate里持续检测输入(物理更新用FixedUpdate更适配):

private void FixedUpdate()
{
    // 获取水平轴输入(A/D或左右箭头),范围-1到1
    float horizontalInput = Input.GetAxis("Horizontal");
    // 持续更新X轴速度,保留Y轴速度
    rb.velocity = new Vector2(horizontalInput * moveSpeed, rb.velocity.y);
}

方案2:使用物理力施加(更贴合物理引擎逻辑)

若希望角色移动符合物理规则(比如有加速度、受阻力影响),可以用AddForce,此时需乘以Time.deltaTime保证帧率无关,且在FixedUpdate里持续调用:

private void FixedUpdate()
{
    float horizontalInput = Input.GetAxis("Horizontal");
    // 用Force模式持续施加力,需乘以Time.fixedDeltaTime(FixedUpdate的固定时间增量)
    rb.AddForce(Vector2.right * moveSpeed * horizontalInput * Time.fixedDeltaTime, ForceMode2D.Force);
}

额外注意事项

  • 检查刚体的Drag属性:如果不需要减速效果,可将Drag设为0,避免速度被无故消耗。
  • 匀速移动需持续同步velocity:物理系统会根据力、阻力等因素改变速度,若要保持匀速,必须持续更新velocity值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 09:50:17