step | 推进物理模拟的时间。 |
void 是否正在运行模拟。物理回调期间无法成功运行模拟。
进行与此 PhysicsScene 关联的物理模拟。
调用此方法会导致在指定的 step
时间内的物理模拟。只会进行与此 PhysicsScene 关联的物理模拟。如果此 PhysicsScene 不是默认的物理场景(请参阅 Physics.defaultPhysicsScene),那么它与特定的 Scene 相关联,因此,只有添加到该 Scene 的组件才会在运行模拟时受到影响。
如果将与帧率相关的步长值(例如 Time.deltaTime)传递给物理引擎,则由于可能出现的不可预测的帧率波动,模拟的确定性将降低。要获得确定性的物理结果,每次调用 PhysicsScene.Simulate 时都应该向其传递一个固定的步长值。
即使不处于播放模式下,也可以在 Editor 中调用 PhysicsScene.Simulate,但要务必小心,因为这将导致模拟移动附加了 Rigidbody 组件的游戏对象。在非播放模式下的 Editor 中进行模拟时,将对所有物理组件(包括 Rigidbody、Collider 和 Joint)进行完整的模拟,并会生成接触点,但不通过标准脚本回调报告接触点。这是一种安全措施,可防止回调删除场景中的对象(这是一种不可撤销的操作)。
下面是一个基本模拟示例,它实现了在自动模拟模式下完成的操作。
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。