Menu
CoddyTech

Немасштабируемое время

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

Даже приостановленной или замедленной игре для некоторых вещей всё ещё нужны реальные часы: меню паузы с анимацией, обратный отсчёт перед продолжением игры, заморозка, которая должна закончиться сама. Time.unscaledDeltaTime — это реальное время с момента последнего кадра независимо от значения Time.timeScale, а Time.unscaledTime — реальное время с момента запуска игры. Это меню паузы вращает индикатор загрузки по реальному времени, поэтому тот продолжает вращаться, пока игра приостановлена:

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // пол-оборота в секунду, независимо от того, включена пауза или нет
}

В корутинах есть такая же пара. WaitForSeconds отсчитывает игровое время, поэтому при Time.timeScale = 0 ожидание никогда не заканчивается; WaitForSecondsRealtime отсчитывает реальные секунды. Эта корутина запускается при открытии меню и мигает заголовком меню каждые полсекунды:

IEnumerator Blink()
{
    while (true)
    {
        title.SetActive(!title.activeSelf);
        yield return new WaitForSecondsRealtime(0.5f);
    }
}

Используй масштабированные значения для игрового процесса, который должен останавливаться вместе с игрой, а немасштабированные — для того, что должно работать, пока игра приостановлена или замедлена: меню, их анимации и таймеры, завершающие паузу. У Invoke нет версии для реального времени: он всегда отсчитывает игровое время.

challenge icon

Задание

Средне

Хит-стоп делает сильный удар ощутимым: в момент удара вся игра на мгновение замирает. Стрелки перемещают сбрасыватель, а клавиша Space сбрасывает с него наковальню (Dropper.cs уже готов). Напиши Anvil.cs, который будет у каждой наковальни:

  • Когда наковальня во что-либо врезается, заморозь игру: Time.timeScale — 0.
  • Через freezeTime секунд реального времени (0.3 в Inspector) снова установи значение 1.

Нажми Play, сбрось несколько наковален, затем нажми Check.

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

using System.Collections;
using UnityEngine;

public class Anvil : MonoBehaviour
{
    public float freezeTime = 0.3f;

    // Остановите игру на freezeTime секунд реального времени, когда наковальня ударится обо что-нибудь
}
quiz iconПроверьте себя

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

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