Объявление
public void Simulate(float step);Параметры
step | Время, чтобы продвинуть физику. |
Возвращает
void Была ли запущена симуляция или нет. Запуск симуляции во время обратных вызовов физики всегда завершается ошибкой.
Описание
Смоделируйте физику, связанную с этой PhysicsScene.
При вызове этого метода физика моделируется в течение заданного step
времени. Будет смоделирована только физика, связанная с этой PhysicsScene. Если эта PhysicsScene не является физической сценой по умолчанию (см. Physics.defaultPhysicsScene), то она связана с определенной Scene, поэтому при запуске имитации затрагиваются только компоненты, добавленные в эту Scene.
Если вы передаете значения шага, зависящие от частоты кадров (например, Time.deltaTime), в физический движок, ваша симуляция будет менее детерминированной из-за непредсказуемых колебаний частоты кадров. что может возникнуть. Чтобы получить более детерминированные физические результаты, вы должны передавать фиксированное значение шага в PhysicsScene.Simulate каждый раз, когда вы его вызываете.
Вы можете вызвать PhysicsScene.Simulate в редакторе вне игрового режима, однако следует соблюдать осторожность, так как это приведет к перемещению игрового объекта, имеющего прикрепленный компонент Rigidbody. При симуляции в редакторе вне режима игры происходит полная симуляция всех физических компонентов, включая Rigidbody, Collider и Joint, включая генерацию контактов, однако контакты не передаются через стандартные обратные вызовы скрипта. Это мера безопасности, позволяющая запретить обратным вызовам удалять объекты в сцене, что не является отменяемой операцией. Вот пример базовой симуляции, реализующей то, что делается в режиме автоматической симуляции.
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);
}
// Here you can access the transforms state right after the simulation, if needed...
}
}