Замедленное движение
Часть раздела Создание настоящих игр путешествия по 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, продолжает работать без изменений.
Задание
СреднеКомета пересекает небо, и 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;
// Замедленное движение, пока что-либо находится внутри зоны
}
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time10Проект: 3D-платформер
ТрассаДвижущиеся платформы2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банке