Замедленное движение
Часть раздела Создание настоящих игр путешествия по 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, продолжает работать без изменений.
Задание
СреднеПосмотри, как комета пролетает через SlowZone в замедленном темпе.
- В
SlowZone.csнапишиvoid OnTriggerEnter(Collider other): задай дляTime.timeScaleзначениеslowScale, а дляTime.fixedDeltaTime—0.02f * slowScale. - Напиши
void OnTriggerExit(Collider other): верни им значения1fи0.02f.
Нажми «Играть» и клавишу «Пробел»: комета пролетит через зону со скоростью 0.4. Затем нажми «Проверить».
Попробуйте сами
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// Замедление времени, пока что-то находится внутри зоны
}
Все уроки раздела Создание настоящих игр
1Текст на экране
Холст и текстПокажем счётФорматирование чиселТаймер обратного отсчётаПовторение: спидометр4Сцены и уровни
Загрузить сценуПерезапустить уровеньСледующий уровеньСохранить между сценамиПовторение: выбор уровня7Управление временем
Пауза с timeScaleЗамедленное движениеНемасштабируемое времяПовторение: Bullet Time2Кнопки и экраны
Кнопки и onClickЛямбдыСвязи в InspectorВключение и выключение панелейШкалы здоровьяПовторение: магазин улучшений5Сохранение с помощью PlayerPrefs
Сохранение числаЗагрузка со значением по умолчаниюРекордСохранение настроекПовторение: монеты в банкеПотренируйтесь самостоятельно: Песочница Unity