Объявление
public static bool Simulate(float step);Параметры
step | Время, чтобы продвинуть физику. |
Возвращает
bool Была ли запущена симуляция или нет. Запуск симуляции во время обратных вызовов физики всегда завершается ошибкой.
Описание
Смоделируйте физику в сцене.
Вызов Physics2D.Simulate не приводит к тому, что Unity вызывает FixedUpdate. Unity по-прежнему вызывает MonoBehaviour.FixedUpdate со скоростью, определяемой Time.fixedDeltaTime, независимо от того, включено или выключено автоматическое моделирование, и независимо от того, когда вы вызываете Physics2D.Simulate.
Обратите внимание, что если вы передаете значения шага, зависящие от частоты кадров (например, Time.deltaTime), в физический движок, ваша симуляция будет менее детерминированной из-за непредсказуемых колебаний. в частоте кадров, которые могут возникнуть. Чтобы получить более детерминированные результаты физики, вы должны передавать фиксированное значение шага в Physics2D.Simulate каждый раз, когда вы его вызываете.
Вы можете вызвать Physics2D.Simulate в редакторе вне игрового режима, однако рекомендуется соблюдать осторожность, так как это приведет к перемещению игровых объектов, к которым прикреплен Rigidbody2D. При симуляции в Редакторе вне режима игры происходит полная симуляция всех физических компонентов, включая Rigidbody2D, Collider2D, Joint2D и Effector2D, и создаются контакты. Однако о контактах не сообщается через стандартные обратные вызовы скрипта. Это мера безопасности, предотвращающая удаление объектов в сцене обратными вызовами, что не является отменяемой операцией.
Смотрите так же: Physics2D.simulationMode.
Вот пример базовой симуляции, реализующей то, что делается в режиме автоматической симуляции.
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;
// Догнать игровое время.
// Продвижение физического моделирования частями Time.fixedDeltaTime
// Обратите внимание, что обычно мы не хотим передавать переменную delta в Simulate, так как это приводит к нестабильным результатам.
while (timer >= Time.fixedDeltaTime)
{
timer -= Time.fixedDeltaTime;
Physics2D.Simulate(Time.fixedDeltaTime);
}
// Here you can access the transforms state right after the simulation, if needed...
}
}