Как сделать эффект замедления времени в Unity3D

Приветствую! Когда- то давно я задавался вопросом, как сделать замедление времени в Unity. И казалось-бы первый же запрос в поисковике, выдаст верное решение. Использовать Time.timeScale, но есть одно но. Маленькое такое "но". Если использовать только эту строчку кода, то при замедлении физика начинает вести себя странно, она дергается, хотя FPS не проседает.

Что-же происходит? А происходит вот, что:

Когда вы замедляете время с помощью строчки кода, к примеру,
Time.timeScale = 0.5f. Время замедляется и все, что использует Time.deltaTime тоже замедлиться, логично. Но физика рассчитывается не с помощью update а c помощью FixedUpdate! Соответственно, использует Time.fixedDeltaTime.

Поэтому, когда все замедляется, физика рассчитывается все с той же скоростью, через равные промежутки времени и визуально все дергается.

Что же делать?

Все оказалось банально, как и всегда.

Вместе с Time.timeScale нужно пропорционально менять и Time.fixedDeltaTime. Тогда физика будет рассчитываться правильно в соответствии с замедлением и дерганья не будет. приведу пример.

using UnityEngine;

public class slow_motion : MonoBehaviour
{
    void Start()
    {
        Time.timeScale = 0.1f;
        Time.fixedDeltaTime = Time.timeScale * 0.02f;
    }

}
Видео на примере игры Idle collection Tycoon. Специально для статьи)
5/5 (3)

Оцените