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.
Wyzwanie
ŚredniDodaj do kortu tenisowego menu pauzy. Scena łączy przyciski Pauza i Wznów.
- W pliku
PauseMenu.csmetodaPause()ustawiaTime.timeScale = 0f;i wywołujepanel.SetActive(true);. - Metoda
Resume()ustawiaTime.timeScale = 1f;i wywołujepanel.SetActive(false);. - W pliku
BallMachine.csdodajif (Time.timeScale == 0f) return;nad sprawdzeniem klawisza spacji w metodzieUpdate().
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
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz2Przyciski i ekrany
Przyciski i onClickLambdyPodłączanie w InspectorzeWłączanie i wyłączanie paneliPaski zdrowiaPodsumowanie: sklep z ulepszeniami5Zapisywanie za pomocą PlayerPrefs
Zapisz liczbęWczytywanie z wartością domyślnąNajlepszy wynikZapisz ustawieniaPodsumowanie: monety w bankuPoćwicz samodzielnie: Edytor online Unity