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

Unity C# 调用AddForce时小球移动速度随显示窗口大小变化问题求助

问题根源
  • 物理逻辑放在了LateUpdate中执行:LateUpdate调用频率和游戏帧率完全绑定,开启MaximizeOnPlay时渲染压力低、帧率高,AddForce调用次数多,小球速度就快;窗口缩小时帧率降低,AddForce调用次数少,速度自然变慢,这是核心诱因。
  • 时间系数使用错误:在非物理周期方法中使用Time.fixedDeltaTime不符合Unity执行规范,且默认ForceMode.Force模式下AddForce已经由引擎内部自动乘以固定时间步长,手动额外乘会导致力的大小不符合预期。
  • 力的计算逻辑错误:你构造的力向量中Z轴分量直接使用了verticalSpeed未做时间缩放,Z轴向的力完全随帧率波动,进一步放大了速度差异。
  • 不规范操作:运行时动态修改Rigidbody的mass属性会影响物理引擎结算稳定性,完全可以通过调整力的大小、空气阻力等参数实现下落效果,不需要频繁修改质量。
修复方案

所有物理相关的操作必须放在FixedUpdate中执行,FixedUpdate会按照Unity设置的固定时间步长调用,完全不受帧率波动影响,修改后的参考代码如下:

using UnityEngine;

public class PlayerController : MonoBehaviour
{
    private bool isGrounded = false;
    private Rigidbody _ourRigidbody;

    [SerializeField] private float moveForwardForce = 7f; // 调整数值匹配你需要的前进速度
    [SerializeField] private float fallExtraForce = 50f; // 调整数值匹配原来的下落速度

    void OnCollisionEnter(Collision other)
    {
        if (other.gameObject.CompareTag("Ground"))
        {
            isGrounded = true;
        }
    }
    void OnCollisionExit(Collision other)
    {
        if (other.gameObject.CompareTag("Ground"))
        {
            isGrounded = false;
        }
    }

    void Start()
    {
        _ourRigidbody = GetComponent<Rigidbody>();
        // 直接在Inspector面板设置Rigidbody的Mass为1即可,无需运行时修改
    }

    void FixedUpdate()
    {
        Vector3 appliedForce = Vector3.zero;
        if (isGrounded)
        {
            appliedForce.z = moveForwardForce;
        }
        else
        {
            appliedForce.y = -fallExtraForce;
        }
        _ourRigidbody.AddForce(appliedForce);
    }
}

如果测试后手感和原有逻辑有差异,直接调整两个公开序列化字段的数值即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 19:27:04