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
相关产品推荐
相关产品推荐

