deltaTime | 物理推进的时间。 |
simulationLayers | 要模拟的 Rigidbody2D 和 Collider2D 图层。 |
bool 代表是否运行了模拟。在物理回调过程中运行模拟将始终失败。
模拟与这个 PhysicsScene 关联的物理。
调用 PhysicsScene2D.Simulate 将执行一个模拟步骤,在指定的时间跨度 step
模拟物理。
默认情况下,模拟 所有图层,但如果你指定图层,那么只模拟 Rigidbody2D。此外,只处理指定图层的 Collider2D 的接触。最后,只处理指定图层上的 关节 或 效应器。
可以在播放模式之外的编辑器中调用 PhysicsScene2D.Simulate,但是建议谨慎使用,因为这将导致模拟移动带有附加 Rigidbody2D 组件的 GameObject。在播放模式之外的编辑器中进行模拟时,将对所有物理组件进行完全模拟,其中包括 Rigidbody2D、Collider2D、Joint2D 和 Effector2D,也会生成接触。但是,不会通过标准脚本回调报告接触。这是一项安全措施,旨在防止回调删除场景中的对象,这是不可撤消的操作。
注意:调用 Physics2D.Simulate 不会导致 Unity 调用 FixedUpdate。无论是否启用自动仿真,Unity 仍会以 Time.fixedDeltaTime 定义的频率调用 MonoBehaviour.FixedUpdate,并且无论您何时调用 Physics2D.Simulate。此外,如果您将帧速率相关步长值(如 Time.deltaTime)传递给物理引擎,那么由于可能出现帧速率不可预测的波动,您的仿真将不那么确定性。为了获得更确定的物理结果,您应在每次调用 Physics2D.Simulate 时传递一个固定步长值。
其他资源: Physics2D.simulationMode 和 Physics2D.Simulate。
以下是一个基本仿真的示例,其中实现了自动仿真模式中所做的事情。
using UnityEngine;
public class BasicSimulation : MonoBehaviour { public PhysicsScene physicsScene; private float timer;
void Update() { if (!physicsScene.IsValid()) return; // do nothing if the physics Scene is not valid.
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; physicsScene.Simulate(Time.fixedDeltaTime); }
// Here you can access the transforms state right after the simulation, if needed... } }