deltaTime | 要向前推进物理模拟的时间。 |
simulationLayers | 要模拟的Rigidbody2D 和 Collider2D 层。 |
bool 模拟是否运行。在物理回调期间运行模拟将始终失败。
在默认物理场景中模拟物理。
调用 Physics2D.Simulate 将执行单个模拟步骤,在指定 step
时间内模拟物理。
默认情况下,会模拟所有层,但是如果指定了层,则只会模拟这些层上的Rigidbody2D。同时,只会处理指定层上的Collider2D 的接触。最后,只会处理指定层上的关节 或 效应器。
您可以在编辑器中(在播放模式之外)调用 Physics2D.Simulate,但建议谨慎操作,因为这会导致模拟移动具有附加 Rigidbody2D 组件的游戏对象。在编辑器中(在播放模式之外)进行模拟时,将对所有物理组件(包括 Rigidbody2D、Collider2D、Joint2D 和 Effector2D)执行完整模拟,并生成接触。但是,不会通过标准脚本回调报告接触。这是一项安全措施,可防止回调删除场景中的对象,因为此操作无法撤消。
注意:调用 Physics2D.Simulate 不会导致 Unity 调用 FixedUpdate。无论自动模拟是否开启,以及无论何时调用 Physics2D.Simulate,Unity 仍会按照 Time.fixedDeltaTime 定义的速率调用 MonoBehaviour.FixedUpdate。此外,如果将依赖于帧率的步长值(例如 Time.deltaTime)传递给物理引擎,则由于可能出现的帧率不可预测的波动,您的模拟将变得不那么确定性。为了获得更确定的物理结果,您应该每次调用 Physics2D.Simulate 时都传递一个固定的步长值。
其他资源:Physics2D.simulationMode 和 PhysicsScene2D.Simulate。
以下是一个实现自动模拟模式中执行操作的基本模拟示例。
using UnityEngine;
public class BasicSimulation : MonoBehaviour { private float timer;
void Update() { if (Physics2D.simulationMode != SimulationMode2D.Script) return; // do nothing if simulation is not set to be executed via script.
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; Physics2D.Simulate(Time.fixedDeltaTime); }
// Here you can access the transforms state right after the simulation, if needed... } }