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.
Wyzwanie
ŚredniMaszyna 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.csnaciśnięcie spacji nie może wyrzucać piłki, gdy gra jest wstrzymana. Obracanie nie wymaga zmian: jest zapisane z użyciemTime.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
}
}
Ta lekcja zawiera krótki quiz. Zacznij lekcję, żeby na niego odpowiedzieć i śledzić swoje postępy.
Wszystkie lekcje w sekcji Tworzenie prawdziwych gier
1Tekst na ekranie
Canvas i tekstWyświetlanie wynikuFormatowanie liczbOdliczanie czasuPowtórka: prędkościomierz4Sceny i poziomy
Wczytaj scenęUruchom poziom ponownieNastępny poziomZachowaj między scenamiPodsumowanie: wybór poziomu10Projekt: platformówka 3D
TrasaRuchome platformy2Przyciski 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 banku