Menu
CoddyTech

Pauza z timeScale

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

Time.timeScale określa, jak szybko płynie czas w grze: 1 oznacza normalną prędkość, a 0 zatrzymuje go. Przy wartości 0 Time.deltaTime wynosi 0, więc każdy ruch zapisany jako speed * Time.deltaTime ustaje. FixedUpdate() nie jest już wywoływana, więc obiekty Rigidbody zawisają w powietrzu, a WaitForSeconds i Invoke czekają, ponieważ odmierzają czas gry. Ten skrypt przełącza pauzę za pomocą przycisku, którego lista On Click wywołuje TogglePause, i wyświetla panel podczas pauzy:

public class PauseToggle : MonoBehaviour
{
    public GameObject pausePanel;
    bool paused;

    public void TogglePause()
    {
        paused = !paused;
        Time.timeScale = paused ? 0f : 1f;
        pausePanel.SetActive(paused);
    }
}

Nie wszystko się zatrzymuje. Update() i LateUpdate() nadal są wywoływane w każdej klatce, przy czym Time.deltaTime wynosi 0, yield return null w korutynie nadal wznawia jej działanie w następnej klatce, a interfejs nadal reaguje na kliknięcia — dzięki temu przycisk może zakończyć pauzę. Klawisze również są nadal odczytywane: żaba, która skacze po naciśnięciu spacji w Update(), zareagowałaby na naciśnięcie podczas pauzy i skoczyła przy pierwszym kroku fizyki po jej zakończeniu. Jej skrypt pomija odczytywanie klawiszy, gdy czas stoi w miejscu:

void Update()
{
    if (Time.timeScale == 0f) return;   // wstrzymano: ignoruj klawisze
    if (Input.GetKeyDown(KeyCode.Space))
    {
        rb.AddForce(Vector3.up * jump, ForceMode.Impulse);
    }
}

Time.timeScale dotyczy całej gry, a nie pojedynczej sceny: jeśli wczytasz inną scenę, gdy wartość wynosi 0, nowa scena rozpocznie się z włączoną pauzą. Przycisk w menu, który uruchamia poziom ponownie lub z niego wychodzi, najpierw ustawia tę wartość z powrotem na 1.

challenge icon

Wyzwanie

Średni

Maszyna do piłek na korcie tenisowym obraca się za pomocą strzałek w lewo i w prawo oraz wyrzuca piłkę po naciśnięciu spacji (BallMachine.cs). Dodaj do kortu menu pauzy w pliku PauseMenu.cs. W scenie przycisk Pause jest powiązany z metodą Pause(), a przycisk Resume, który znajduje się na ukrytym panelu PausePanel, z metodą Resume(); w Inspectorze przypisz panel do panel.

  • Pause() zatrzymuje czas gry i wyświetla panel.
  • Resume() przywraca normalne tempo gry i ukrywa panel.
  • W pliku BallMachine.cs naciśnięcie spacji nie może wyrzucać piłki, gdy gra jest wstrzymana. Obracanie nie wymaga zmian: jest zapisane z użyciem Time.deltaTime.

Naciśnij Play, wyrzuć piłkę i wstrzymaj grę, gdy będzie w powietrzu, a następnie naciśnij Check.

Spróbuj swoich sił

using UnityEngine;

public class PauseMenu : MonoBehaviour
{
    public GameObject panel;

    public void Pause()
    {
        // Zatrzymaj czas gry i pokaż panel
    }

    public void Resume()
    {
        // Czas gry znów płynie z normalną prędkością, panel jest ukryty
    }
}
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