step | 物理要前进的时间。 |
在场景中模拟物理。
当模拟模式设置为脚本时,调用此方法以手动模拟物理。模拟包括所有阶段的碰撞检测、刚体和关节集成,以及物理回调(接触、触发器和关节)的文件。调用 Physics.Simulate 不会导致 FixedUpdate 被调用。 MonoBehaviour.FixedUpdate 仍然会以由 Time.fixedDeltaTime 定义的速率调用,无论模拟模式设置为脚本与否,以及无论何时调用 Physics.Simulate。
请注意,如果您将帧率相关的步长值(例如 Time.deltaTime)传递给物理引擎,由于帧率可能会出现不可预测的波动,因此您的模拟将是非确定性的。
要实现确定性的物理结果,您应该在每次调用 Physics.Simulate 时传递一个固定的步长值。通常,step
应该是一个小的正数。使用大于 0.03 的 step
值可能会产生不准确的结果。
其他资源: Physics.simulationMode, SimulationMode。
以下是一个基本模拟的示例,它实现了在 SimulationMode.FixedUpdate 模拟模式中完成的操作(不包括 Time.maximumDeltaTime)。
using UnityEngine;
public class BasicSimulation : MonoBehaviour { private float timer;
void Update() { if (Physics.simulationMode != SimulationMode.Script) return; // do nothing if the automatic simulation is enabled
timer += Time.deltaTime;
// Catch up with the game time. // Advance the physics simulation in portions of Time.fixedDeltaTime // Note that generally, we don't want to pass variable delta to Simulate as that leads to unstable results. while (timer >= Time.fixedDeltaTime) { timer -= Time.fixedDeltaTime; Physics.Simulate(Time.fixedDeltaTime); }
// Here you can access the transforms state right after the simulation, if needed } }