Menu
CoddyTech

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

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

Time.timeScale от 0 до 1 означает замедленное движение. При значении 0.25 Time.deltaTime составляет четверть реального времени кадра, поэтому автомобиль, перемещаемый с помощью speed * Time.deltaTime, за каждую реальную секунду проходит четверть расстояния, объекты Rigidbodies летят и падают с четвертью своей скорости, а 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

Задание

Средне

Комета пересекает небо, и Space запускает её слева (Launcher.cs, готово). На своём пути она пролетает через SlowZone — триггерную зону, и этот участок её полёта должен воспроизводиться в замедленном движении. Напиши SlowZone.cs:

  • Когда что-то входит в зону, игровое время идёт со скоростью slowScale (0.4 в Inspector), а шаг физики уменьшается в тот же раз относительно 0.02, чтобы комета продолжала двигаться плавно.
  • Когда объект покидает зону, время снова идёт с обычной скоростью, а шаг физики возвращается к 0.02.

Нажми Play, нажми Space и наблюдай, как комета пролетает через зону, затем нажми Check.

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

using UnityEngine;

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

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

В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.

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