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

Unity中AddForce施加力与代码设定不符,w/s键移动物体幅度极小

问题原因及修复方案

核心错误:Time.deltaTime乘算位置错误

你代码里的乘算逻辑完全写错了,这是导致前后移动、跳跃力度异常的直接原因:

  • a/d按键对应的横向移动逻辑中,rb.AddForce(100, 0, 0 * Time.deltaTime) 只有z轴的0值乘了Time.deltaTime,实际施加的x轴力是完整的100,力度足够所以移动正常
  • w/s按键对应的前后移动逻辑中,rb.AddForce(0, 0, 100 * Time.deltaTime) z轴的力被乘了Time.deltaTime,FixedUpdate下Time.deltaTime固定为0.02左右,相当于实际只施加了2的力,远小于横向的100,所以只能产生极微小平移
  • 跳跃逻辑中rb.AddForce(0, 40, 0 * Time.deltaTime) 虽然y轴力没有被错误乘算,但默认ForceMode.Force是持续力,单帧40的力不足以抵消重力产生明显跳跃效果

正确代码示例

FixedUpdate中建议使用Time.fixedDeltaTime做时间缩放,跳跃建议使用Impulse力模式匹配瞬时发力的逻辑,同时补充接地判断避免空中重复施力:

void FixedUpdate()
{ 
    if (Input.GetKey("d"))
    {
       rb.AddForce(100 * Time.fixedDeltaTime, 0, 0); 
    }
    if (Input.GetKey("a"))
    {
       rb.AddForce(-100 * Time.fixedDeltaTime, 0, 0); 
    }
    if (Input.GetKey("s"))
    {
       rb.AddForce(0, 0, -100 * Time.fixedDeltaTime); 
    }
    if (Input.GetKey("w"))
    {
       rb.AddForce(0, 0, 100 * Time.fixedDeltaTime); 
    }
    // IsGrounded为自定义接地检测方法,可通过射线检测、碰撞事件等实现
    if (Input.GetKey("space") && IsGrounded())
    {
       rb.AddForce(0, 5, 0, ForceMode.Impulse); 
    }
}

额外排查项

如果修改代码后问题仍然存在,检查以下设置:

  • 刚体组件的Constraints项是否锁定了z轴、y轴位移
  • 玩家碰撞体是否和地面/其他场景物体穿模,产生额外摩擦力阻挡移动
  • 刚体质量(Mass)参数是否设置过大,导致小力度无法驱动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 00:36:02