Version: 2023.2
public void Simulate (float step);

参数

step 推进物理模拟的时间。

返回

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

描述

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

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

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

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

using UnityEngine;
using UnityEngine.SceneManagement;

public class MultiScenePhysics : MonoBehaviour { private Scene extraScene;

public void Start() { // First create an extra scene with local physics extraScene = SceneManager.CreateScene("Scene", new CreateSceneParameters(LocalPhysicsMode.Physics3D));

// Mark the scene active, so that all the new GameObjects end up in the newly created scene SceneManager.SetActiveScene(extraScene);

PopulateExtraSceneWithObjects(); }

public void FixedUpdate() { // All of the non-default physics scenes need to be simulated manually var physicsScene = extraScene.GetPhysicsScene(); { var autoSimulation = Physics.autoSimulation; Physics.autoSimulation = false; physicsScene.Simulate(Time.fixedDeltaTime); Physics.autoSimulation = autoSimulation; } }

public void PopulateExtraSceneWithObjects() { // Create GameObjects for physics simulation var sphere = GameObject.CreatePrimitive(PrimitiveType.Sphere); sphere.AddComponent<Rigidbody>(); sphere.transform.position = Vector3.up * 4; } }

另请参阅:Physics.Simulate