Menu
CoddyTech

Замедленное движение

Часть раздела Создание настоящих игр путешествия по Unity на Coddy. Урок 35 из 60.

Значение Time.timeScale между 0 и 1 замедляет время. При значении 0.25 Time.deltaTime составляет четверть реального времени кадра, поэтому машина, перемещаемая с помощью speed * Time.deltaTime, за каждую реальную секунду преодолевает четверть расстояния, тела с компонентом Rigidbody летят и падают с четвертью своей скорости, а WaitForSeconds(1f) длится 4 реальные секунды. При значении выше 1 игра ускоряется: 2 — это двойная скорость.

Для физики нужна ещё одна строка. Каждый шаг физики по-прежнему продвигает игру на Time.fixedDeltaTime, то есть на 0.02 секунды игрового времени, а при значении 0.25 эти шаги занимают 0.08 реальной секунды: FixedUpdate() выполняется всего 12.5 раза в секунду реального времени, поэтому тела перемещаются лишь в каждом пятом кадре и дёргаются. Уменьши шаг во столько же раз и затем восстанови оба значения, поскольку Unity никогда не сбрасывает fixedDeltaTime самостоятельно. Этот скрипт замедляет игру, пока удерживается Space:

float normalStep;

void Awake()
{
    normalStep = Time.fixedDeltaTime;   // 0.02 в новом проекте
}

void Update()
{
    if (Input.GetKeyDown(KeyCode.Space))
    {
        Time.timeScale = 0.25f;
        Time.fixedDeltaTime = normalStep * Time.timeScale;
    }
    if (Input.GetKeyUp(KeyCode.Space))
    {
        Time.timeScale = 1f;
        Time.fixedDeltaTime = normalStep;
    }
}

При меньшем шаге физика по-прежнему выполняется 50 раз в секунду реального времени, и каждый шаг охватывает четверть игрового времени, поэтому замедление остаётся плавным. Шаг задаётся в игровых секундах, поэтому код в FixedUpdate(), который использует Time.deltaTime, продолжает работать без изменений.

challenge icon

Задание

Средне

Посмотри, как комета пролетает через SlowZone в замедленном темпе.

  1. В SlowZone.cs напиши void OnTriggerEnter(Collider other): задай для Time.timeScale значение slowScale, а для Time.fixedDeltaTime — 0.02f * slowScale.
  2. Напиши void OnTriggerExit(Collider other): верни им значения 1f и 0.02f.

Нажми «Играть» и клавишу «Пробел»: комета пролетит через зону со скоростью 0.4. Затем нажми «Проверить».

Попробуйте сами

using UnityEngine;

public class SlowZone : MonoBehaviour
{
    public float slowScale = 0.4f;

    // Замедление времени, пока что-то находится внутри зоны
}

Все уроки раздела Создание настоящих игр

Потренируйтесь самостоятельно: Песочница Unity