Version: 2017.4
LanguageEnglish
  • C#
  • JS

Script language

Select your preferred scripting language. All code snippets will be displayed in this language.

Physics.Simulate

Suggest a change

Success!

Thank you for helping us improve the quality of Unity Documentation. Although we cannot accept all submissions, we do read each suggested change from our users and will make updates where applicable.

Close

Submission failed

For some reason your suggested change could not be submitted. Please <a>try again</a> in a few minutes. And thank you for taking the time to help us improve the quality of Unity Documentation.

Close

Cancel

public static method Simulate(step: float): void;
public static void Simulate(float step);

Parameters

stepThe time to advance physics by.

Description

Simulate physics in the scene.

Call this to simulate physics manually when the automatic simulation is turned off. Simulation includes all the stages of collision detection, rigidbody and joints integration, and filing of the physics callbacks (contact, trigger and joints). Calling Physics.Simulate does not cause FixedUpdate to be called. MonoBehaviour.FixedUpdate will still be called at the rate defined by Time.fixedDeltaTime whether automatic simulation is on or off, and regardless of when you call Physics.Simulate.

Note that if you pass framerate-dependent step values (such as Time.deltaTime) to the physics engine, your simulation will be non-deterministic because of the unpredictable fluctuations in framerate that can arise.

To achieve deterministic physics results, you should pass a fixed step value to Physics.Simulate every time you call it. Usually, step should be a small positive number. Using step values greater than 0.03 is likely to produce inaccurate results.

See Also: Physics.autoSimulation.

Here is an example of a basic simulation that implements what's being done in the automatic simulation mode (excluding Time.maximumDeltaTime).

#pragma strict
public class BasicSimulation extends MonoBehaviour {
	private var timer: float;
	function Update() {
		if (Physics.autoSimulation)return ;
		// do nothing if the automatic simulation is enabled
		timer += Time.deltaTime;
		while ( timer >= Time.fixedDeltaTime ) {
			timer -= Time.fixedDeltaTime;
			Physics.Simulate(Time.fixedDeltaTime);
		}
		// Here you can access the transforms state right after the simulation, if needed
	}
}
using UnityEngine;

public class BasicSimulation : MonoBehaviour { private float timer;

void Update() { if (Physics.autoSimulation) 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 } }