Menu
CoddyTech

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

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

Даже в приостановленной или замедленной игре некоторым вещам нужны настоящие часы: анимированному меню паузы, обратному отсчёту перед продолжением игры, заморозке, которая должна закончиться сама по себе. 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

Задание

Средне

Добавь наковальне эффект кратковременной остановки: вся игра замирает на мгновение, когда она приземляется.

  1. В Anvil.cs напиши IEnumerator HitStop(): Time.timeScale = 0f;, затем yield return new WaitForSecondsRealtime(freezeTime);, после чего установи значение обратно на 1f.
  2. Напиши void OnCollisionEnter(Collision collision), который вызывает StartCoroutine(HitStop());.

Нажми «Играть» и сбрасывай наковальни клавишей Space: при каждом приземлении игра замирает на 0.3 секунды. Затем нажми «Проверить».

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

using System.Collections;
using UnityEngine;

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

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

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

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