Menu
CoddyTech

Pauza z timeScale

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

Time.timeScale określa szybkość upływu czasu w grze: 1 oznacza normalną szybkość, a 0 zatrzymuje czas. Przy wartości 0 Time.deltaTime wynosi 0, więc każdy ruch zapisany jako speed * Time.deltaTime ustaje. FixedUpdate() przestaje być wywoływane, 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, a 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 Space w Update(), zarejestrowałaby naciśnięcie podczas pauzy i wyskoczyłaby w górę w pierwszym kroku fizyki po jej zakończeniu. Jej skrypt pomija obsługę 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 jego wartość wynosi 0, nowa scena rozpocznie się z włączoną pauzą. Przycisk menu, który uruchamia ponownie poziom lub z niego wychodzi, najpierw przywraca tę wartość do 1.

challenge icon

Wyzwanie

Średni

Dodaj do kortu tenisowego menu pauzy. Scena łączy przyciski Pauza i Wznów.

  1. W pliku PauseMenu.cs metoda Pause() ustawia Time.timeScale = 0f; i wywołuje panel.SetActive(true);.
  2. Metoda Resume() ustawia Time.timeScale = 1f; i wywołuje panel.SetActive(false);.
  3. W pliku BallMachine.cs dodaj if (Time.timeScale == 0f) return; nad sprawdzeniem klawisza spacji w metodzie Update().

Naciśnij „Graj”, zaserwuj piłkę i wstrzymaj grę: zawiśnie w powietrzu. Następnie naciśnij „Sprawdź”.

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
    }
}

Wszystkie lekcje w sekcji Tworzenie prawdziwych gier

Poćwicz samodzielnie: Edytor online Unity