Menu
CoddyTech

Czas bez skalowania

Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 36 z 60.

Wstrzymana lub spowolniona gra nadal potrzebuje zegara czasu rzeczywistego do pewnych rzeczy: animowanego menu pauzy, odliczania przed wznowieniem gry czy zamrożenia, które musi zakończyć się samo. Time.unscaledDeltaTime to rzeczywisty czas od poprzedniej klatki, niezależnie od wartości Time.timeScale, a Time.unscaledTime to rzeczywisty czas od uruchomienia gry. To menu pauzy obraca kółko ładowania w czasie rzeczywistym, więc kółko kręci się, gdy gra jest wstrzymana:

void Update()
{
    wheel.Rotate(0f, 0f, -180f * Time.unscaledDeltaTime);   // pół obrotu na sekundę, niezależnie od tego, czy gra jest wstrzymana
}

Korutyny mają taką samą parę. WaitForSeconds odlicza czas gry, więc przy Time.timeScale = 0 nigdy się nie kończy; WaitForSecondsRealtime odlicza sekundy czasu rzeczywistego. Ta korutyna, uruchomiona po otwarciu menu, miga tytułem menu co pół sekundy:

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

Używaj wartości skalowanych w rozgrywce, która powinna zatrzymać się wraz z grą, a nieskalowanych w przypadku elementów, które muszą działać podczas wstrzymania lub spowolnienia gry: menu, jego animacji oraz timerów kończących pauzę. Invoke nie ma wersji działającej w czasie rzeczywistym: zawsze odlicza czas gry.

challenge icon

Wyzwanie

Średni

Dodaj efekt zatrzymania po uderzeniu kowadła: cała gra na chwilę zastyga, gdy kowadło wyląduje.

  1. W pliku Anvil.cs napisz IEnumerator HitStop(): Time.timeScale = 0f;, następnie yield return new WaitForSecondsRealtime(freezeTime);, a potem ustaw z powrotem 1f.
  2. Napisz void OnCollisionEnter(Collision collision), który wywołuje StartCoroutine(HitStop());.

Naciśnij „Graj” i zrzucaj kowadła, używając spacji: każde lądowanie zamrozi grę na 0.3 sekundy. Następnie naciśnij „Sprawdź”.

Spróbuj swoich sił

using System.Collections;
using UnityEngine;

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

    // Zatrzymaj grę na freezeTime sekund czasu rzeczywistego, gdy kowadło w coś uderzy
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity