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

Unity脚本移动Sphere对象:AddForce失效及简易移动方法咨询

解决Rigidbody.AddForce对Sphere不生效的问题

嘿,别担心,rb.AddForce()绝对不是只对立方体有效!它对任何挂载了Rigidbody组件的GameObject都能起作用,Sphere当然也包含在内。你的代码没生效大概率是有几个小细节没注意到,我来一步步帮你搞定:

首先排查常见问题

  • Rigidbody未正确赋值:检查你的rb变量有没有在Unity Inspector面板里拖入Sphere的Rigidbody组件?如果没拖,可以在Start()方法里自动获取,避免手动赋值遗漏:
    void Start () {
        if (rb == null)
            rb = GetComponent<Rigidbody>();
    }
    
  • Rigidbody设置为Kinematic:如果Sphere的Rigidbody勾选了Is Kinematic,那么物理引擎会忽略对它的力作用,直接去掉这个勾选就好。
  • 力的计算错误:你在FixedUpdate()里用了1500 * Time.deltaTime,但AddForce的默认模式(ForceMode.Force)是基于时间的,Unity会自动乘以FixedDeltaTime,这就导致你相当于把力的大小缩小了两次,变得微乎其微!这很可能是关键问题。

修正后的AddForce代码

把力的数值调整一下,去掉多余的Time.deltaTime,试试这个:

public Rigidbody rb;

void Start () {
    if (rb == null)
        rb = GetComponent<Rigidbody>();
}

void FixedUpdate () {
    // 使用默认的ForceMode.Force,Unity会自动处理时间缩放
    rb.AddForce(0, 0, 1500);
    // 如果你想要瞬间的冲量效果,可以用Impulse模式:
    // rb.AddForce(0, 0, 30, ForceMode.Impulse);
}

如果还是移动不明显,可以把1500调大一些,或者减小Sphere的质量(在Rigidbody组件里修改Mass值)。

其他可行的移动方式

如果你不想用物理引擎驱动,也可以直接修改Transform组件来移动Sphere,这种方式不需要Rigidbody,适合不需要物理交互的场景:

void Update () {
    // 每帧沿自身Z轴向前移动,速度5单位/秒
    transform.Translate(Vector3.forward * 5f * Time.deltaTime);
}

或者直接修改position:

void Update () {
    transform.position += Vector3.forward * 5f * Time.deltaTime;
}

记住,用物理引擎的方式(AddForce)适合需要碰撞、重力、其他物理交互的场景,而直接修改Transform适合简单的、不需要物理效果的移动。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:25:24