版本: Unity 6 (6000.0)
语言英语
  • C#

Physics.Simulate

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法接受所有提交的内容,但我们会阅读用户提出的每项建议并根据需要进行更新。

关闭

提交失败

由于某种原因,您的建议更改无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static void Simulate(float step);

参数

step 物理要前进的时间。

描述

在场景中模拟物理。

当模拟模式设置为脚本时,调用此方法以手动模拟物理。模拟包括所有阶段的碰撞检测、刚体和关节集成,以及物理回调(接触、触发器和关节)的文件。调用 Physics.Simulate 不会导致 FixedUpdate 被调用。 MonoBehaviour.FixedUpdate 仍然会以由 Time.fixedDeltaTime 定义的速率调用,无论模拟模式设置为脚本与否,以及无论何时调用 Physics.Simulate。

请注意,如果您将帧率相关的步长值(例如 Time.deltaTime)传递给物理引擎,由于帧率可能会出现不可预测的波动,因此您的模拟将是非确定性的。

要实现确定性的物理结果,您应该在每次调用 Physics.Simulate 时传递一个固定的步长值。通常,step 应该是一个小的正数。使用大于 0.03 的 step 值可能会产生不准确的结果。

其他资源: Physics.simulationModeSimulationMode

以下是一个基本模拟的示例,它实现了在 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 } }