Объявление
public bool Simulate(float step);Параметры
step | Время, чтобы продвинуть физику. |
Возвращает
bool Была ли запущена симуляция или нет. Запуск симуляции во время обратных вызовов физики всегда завершается ошибкой.
Описание
Смоделируйте физику, связанную с этой PhysicsScene.
При вызове этого метода физика моделируется в течение заданного шага
времени. Будет смоделирована только физика, связанная с этим PhysicsScene2D. Если эта PhysicsScene2D не является физической сценой по умолчанию (см. Physics2D.defaultPhysicsScene), то она связана с определенной Scene, поэтому при запуске имитации затрагиваются только компоненты, добавленные в эту Scene.
Если вы передаете значения шага, зависящие от частоты кадров (например, Time.deltaTime), в физический движок, ваша симуляция будет менее детерминированной из-за непредсказуемых колебаний в кадре. скорость, которая может возникнуть. Чтобы получить более детерминированные физические результаты, вы должны передавать фиксированное значение шага в PhysicsScene2D.Simulate каждый раз, когда вы его вызываете.
Вы можете вызвать PhysicsScene2D.Simulate в редакторе вне игрового режима, однако рекомендуется соблюдать осторожность, так как это приведет к перемещению игровых объектов, к которым прикреплен Rigidbody2D. При симуляции в Редакторе вне режима игры происходит полная симуляция всех физических компонентов, включая Rigidbody2D, Collider2D, Joint2D и Effector2D, и создаются контакты. Однако о контактах не сообщается через стандартные обратные вызовы скрипта. Это мера безопасности, предотвращающая удаление объектов в сцене обратными вызовами, что не является отменяемой операцией.
using UnityEngine;
public class BasicSimulation : MonoBehaviour
{
public PhysicsScene physicsScene;
private float timer;
void Update()
{
if (!physicsScene.IsValid())
return; // do nothing if the physics Scene is not valid.
timer += Time.deltaTime;
// Догоняем игровое время.
// Продвижение физического моделирования частями Time.fixedDeltaTime
// Обратите внимание, что обычно мы не хотим передавать переменную delta в Simulate, так как это приводит к нестабильным результатам.
while (timer >= Time.fixedDeltaTime)
{
timer -= Time.fixedDeltaTime;
physicsScene.Simulate(Time.fixedDeltaTime);
}
// Здесь вы можете получить доступ к состоянию преобразований сразу после моделирования, если это необходимо...
}
}