Physics2D.Simulate
Declaration
public static bool Simulate(float deltaTime, int simulationLayers = Physics2D.AllLayers);Параметры
| Параметр | Описание |
|---|---|
| deltaTime | Время для продвижения физики. |
| simulationLayers | Слои Rigidbody2D и Collider2D для имитации. |
Возвращаемое значение
логическое Запускалась ли симуляция или нет. Запуск симуляции во время обратных вызовов физики всегда будет неудачным.
Описание
Моделирование физики в стандартной сцене физики.
Вызов Physics2D.Simulate выполнит один шаг симулирования, симулируя физику в течение указанного step времени.
По умолчанию, Все слои симулируются, однако если вы указываете слои, то только Rigidbody2D на этих слоях будут симулироваться. Вместе с этим, будут обрабатываться только контакты для Collider2D на указанном layer(s). Наконец, будут обрабатываться только joints или effectors на указанном layer(s).
Вы можете вызвать Physics2D.Simulate в Редакторе вне режима воспроизведения, однако рекомендуется осторожность, так как это приведет к тому, что симуляция переместит GameObjects, к которому прикреплен компонент Rigidbody2D. При симулировании в Редакторе вне режима воспроизведения, полная симуляция происходит для всех физических компонентов, включая Rigidbody2D, Collider2D, Joint2D и Effector2D, и контакты генерируются. Однако контакты не сообщаются через стандартные обратные вызова скрипта. Это мера безопасности, чтобы предотвратить удаление объектов в Scene, что не является операцией, которую можно отменить.
NOTE: Вызов Physics2D.Simulate не вызывает Unity для вызова FixedUpdate. Unity все еще вызывает MonoBehaviour.FixedUpdate со скоростью, определенной Time.fixedDeltaTime независимо от того, включена или выключена автоматическая симуляция, и независимо от того, когда вы вызываете Physics2D.Simulate. Кроме того, если вы передаёте движку физики значения шагов, зависящие от частоты кадров (например, Time.deltaTime), то ваша симуляция будет менее детерминированной из-за непредсказуемых колебаний частоты кадров, которые могут возникнуть. Чтобы достичь более детерминированных физических результатов, вы должны передавать Physics2D.Simulate фиксированное значение шага каждый раз, когда вы его вызываете.
Дополнительные ресурсы: Physics2D.simulationMode и PhysicsScene2D.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... } }