Version: 2022.3
public bool Simulate (float step);

参数

step 推进物理模拟的时间。

返回

bool 是否正在运行模拟。物理回调期间无法成功运行模拟。

描述

进行与此 PhysicsScene 关联的物理模拟。

调用此方法会导致在指定的 step 时间内的物理模拟。只会进行与此 PhysicsScene2D 关联的物理模拟。如果此 PhysicsScene2D 不是默认的物理场景(请参阅 Physics2D.defaultPhysicsScene),那么它与特定的 Scene 相关联,因此,只有添加到该 Scene 的组件才会在运行模拟时受到影响。

如果将与帧率相关的步长值(例如 Time.deltaTime)传递给物理引擎,则由于可能出现的不可预测的帧率波动,模拟的确定性将降低。要获得确定性的物理结果,每次调用 PhysicsScene2D.Simulate 时都应该向其传递一个固定的步长值。

即使不处于播放模式下,也可以在 Editor 中调用 PhysicsScene2D.Simulate,但要务必小心,因为这将导致模拟移动已附加 Rigidbody2D 组件的游戏对象。在非播放模式下的 Editor 中进行模拟时,将对所有物理组件(包括 Rigidbody2DCollider2DJoint2DEffector2D)进行完整的模拟,并会生成接触点。但是,不会通过标准脚本回调来报告接触点。这是一种安全措施,可防止回调删除场景中的对象(这是一种不可撤销的操作)。

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... } }