Menu
CoddyTech

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.

challenge icon

Wyzwanie

Średni

Obserwuj lot komety przez SlowZone w zwolnionym tempie.

  1. W pliku SlowZone.cs napisz void OnTriggerEnter(Collider other): ustaw Time.timeScale na slowScale, a Time.fixedDeltaTime na 0.02f * slowScale.
  2. Napisz void OnTriggerExit(Collider other): przywróć im wartości 1f i 0.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

Poćwicz samodzielnie: Edytor online Unity