Zwolnione tempo
Część sekcji Tworzenie prawdziwych gier ścieżki Unity w Coddy. Lekcja 35 z 60.
Time.timeScale z wartością od 0 do 1 oznacza zwolnione tempo. Przy wartości 0.25 Time.deltaTime wynosi jedną czwartą rzeczywistego czasu klatki, więc samochód poruszany przez speed * Time.deltaTime pokonuje w każdej rzeczywistej sekundzie jedną czwartą swojej drogi, ciała sztywne lecą i spadają z jedną czwartą prędkości, a WaitForSeconds(1f) trwa 4 rzeczywiste sekundy. Powyżej 1 gra działa szybciej: 2 oznacza dwukrotną prędkość.
Fizyka wymaga jeszcze jednej linijki. Każdy krok fizyki nadal przesuwa grę o Time.fixedDeltaTime, czyli o 0.02 sekundy czasu gry, a przy wartości 0.25 upływa 0.08 sekundy rzeczywistej: FixedUpdate() uruchamia się tylko 12.5 razy na sekundę rzeczywistą, więc ciała poruszają się raz na pięć klatek i szarpią. Zmniejsz krok o ten sam współczynnik i przywróć potem obie wartości, ponieważ Unity samo nigdy nie resetuje fixedDeltaTime. Ten skrypt spowalnia grę, gdy przytrzymujesz klawisz Space:
float normalStep;
void Awake()
{
normalStep = Time.fixedDeltaTime; // 0.02 w nowym projekcie
}
void Update()
{
if (Input.GetKeyDown(KeyCode.Space))
{
Time.timeScale = 0.25f;
Time.fixedDeltaTime = normalStep * Time.timeScale;
}
if (Input.GetKeyUp(KeyCode.Space))
{
Time.timeScale = 1f;
Time.fixedDeltaTime = normalStep;
}
}Przy mniejszym kroku fizyka nadal wykonuje 50 kroków na sekundę rzeczywistą, a każdy krok obejmuje jedną czwartą czasu gry, więc zwolnione tempo pozostaje płynne. Krok jest wyrażony w sekundach czasu gry, więc kod w FixedUpdate(), który używa Time.deltaTime, nadal działa bez zmian.
Wyzwanie
ŚredniObserwuj lot komety przez SlowZone w zwolnionym tempie.
- W pliku
SlowZone.csnapiszvoid OnTriggerEnter(Collider other): ustawTime.timeScalenaslowScale, aTime.fixedDeltaTimena0.02f * slowScale. - Napisz
void OnTriggerExit(Collider other): przywróć im wartości1fi0.02f.
Naciśnij „Graj” i spację: kometa przelatuje przez strefę z prędkością 0.4. Następnie naciśnij „Sprawdź”.
Spróbuj swoich sił
using UnityEngine;
public class SlowZone : MonoBehaviour
{
public float slowScale = 0.4f;
// Spowolnienie ruchu, gdy coś znajduje się w strefie
}
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