Menu
CoddyTech

Czas bez skalowania

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

Wstrzymana lub spowolniona gra nadal potrzebuje rzeczywistego zegara do niektórych zadań: animowanego menu pauzy, odliczania przed wznowieniem gry, zamrożenia, które musi się samo zakończyć. Time.unscaledDeltaTime to rzeczywisty czas, który upłynął od poprzedniej klatki, niezależnie od wartości Time.timeScale, a Time.unscaledTime to rzeczywisty czas, który upłynął 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ą tę samą parę. WaitForSeconds odmierza czas gry, więc przy Time.timeScale = 0 nigdy się nie kończy; WaitForSecondsRealtime odmierza rzeczywiste sekundy. Uruchomiona podczas otwierania menu ta korutyna co pół sekundy miga tytułem menu:

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

Używaj wartości skalowanych w rozgrywce, która powinna się zatrzymać, gdy zatrzymuje się gra, a wartości nieskalowanych do tego, co musi działać podczas pauzy lub spowolnienia: menu, jego animacji i timerów kończących pauzę. Invoke nie ma wersji korzystającej z czasu rzeczywistego: zawsze odmierza czas gry.

challenge icon

Wyzwanie

Średni

hit stop sprawia, że mocne uderzenie wydaje się mocne: w chwili uderzenia cała gra zastyga na moment. Strzałki poruszają podajnikiem, a klawisz spacji zrzuca z niego kowadło (Dropper.cs, gotowy). Napisz Anvil.cs, który będzie mieć każde kowadło:

  • Gdy kowadło w cokolwiek uderzy, zamroź grę: Time.timeScale 0.
  • Po freezeTime rzeczywistych sekundach (0.3 w Inspectorze) ustaw z powrotem wartość 1.

Naciśnij Play, zrzuć kilka kowadeł, a następnie Check.

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
}
quiz iconSprawdź się

Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier