版本: Unity 6 (6000.0)
语言英语
  • C#

Physics2D.Simulate

建议更改

成功!

感谢您帮助我们提高 Unity 文档的质量。虽然我们无法采纳所有提交内容,但我们确实会阅读用户提出的每项更改建议,并在适当时进行更新。

关闭

提交失败

由于某些原因,您的更改建议无法提交。请<a>稍后再试</a>。感谢您抽出时间帮助我们提高 Unity 文档的质量。

关闭

取消

声明

public static bool Simulate(float deltaTime, int simulationLayers = Physics2D.AllLayers);

参数

deltaTime 要向前推进物理模拟的时间。
simulationLayers 要模拟的Rigidbody2DCollider2D 层。

返回值

bool 模拟是否运行。在物理回调期间运行模拟将始终失败。

描述

在默认物理场景中模拟物理。

调用 Physics2D.Simulate 将执行单个模拟步骤,在指定 step 时间内模拟物理。

默认情况下,会模拟所有层,但是如果指定了层,则只会模拟这些层上的Rigidbody2D。同时,只会处理指定层上的Collider2D 的接触。最后,只会处理指定层上的关节效应器

您可以在编辑器中(在播放模式之外)调用 Physics2D.Simulate,但建议谨慎操作,因为这会导致模拟移动具有附加 Rigidbody2D 组件的游戏对象。在编辑器中(在播放模式之外)进行模拟时,将对所有物理组件(包括 Rigidbody2DCollider2DJoint2DEffector2D)执行完整模拟,并生成接触。但是,不会通过标准脚本回调报告接触。这是一项安全措施,可防止回调删除场景中的对象,因为此操作无法撤消。

注意:调用 Physics2D.Simulate 不会导致 Unity 调用 FixedUpdate。无论自动模拟是否开启,以及无论何时调用 Physics2D.Simulate,Unity 仍会按照 Time.fixedDeltaTime 定义的速率调用 MonoBehaviour.FixedUpdate。此外,如果将依赖于帧率的步长值(例如 Time.deltaTime)传递给物理引擎,则由于可能出现的帧率不可预测的波动,您的模拟将变得不那么确定性。为了获得更确定的物理结果,您应该每次调用 Physics2D.Simulate 时都传递一个固定的步长值。

其他资源:Physics2D.simulationModePhysicsScene2D.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... } }