Zeitlupeneffekt in Unity

Das Ändern des Zeittempos in Unity ist ganz einfach. Sie müssen lediglich den Wert von Time.timeScale ändern.

Time.timeScale ist ein Wert in Unity, der zeitabhängige Ereignisse wie Update-Funktionen, Animationen, Partikel, Physik usw. steuert. Wenn timeScale 1 ist, vergeht die Zeit so schnell wie Echtzeit, mit 0,5 vergeht die Zeit 2-mal langsamer als Echtzeit und mit 2,0 vergeht die Zeit doppelt so schnell. Time.timeScale mit dem Wert 0 pausiert alle Framerate-abhängigen Berechnungen, negative Werte werden ignoriert.

Allerdings reicht es nicht aus, nur den Wert von timeScale festzulegen, um einen glaubwürdigen Zeitlupeneffekt zu erzielen.

Einige Komponenten wie AudioSource werden nicht von der Zeit beeinflusst, aber glücklicherweise reicht eine Änderung ihrer Tonhöhe aus, um dem Audio einen Zeitlupeneffekt hinzuzufügen.

Zeitlupe in Spielen bezieht sich auf einen visuellen und manchmal funktionalen Effekt, bei dem Gameplay, Grafiken und Animationen verlangsamt werden, um ein dramatisches und stilisiertes Erlebnis zu schaffen. Es wird verwendet, um Schlüsselmomente hervorzuheben, die Spielerkontrolle zu verbessern oder Gameplay-Sequenzen filmisches Flair zu verleihen.

Wenn das Spiel in Zeitlupe läuft, scheint sich im Vergleich zum normalen Gameplay alles mit einer geringeren Geschwindigkeit zu bewegen. Dazu können Charakterbewegungen, Umweltinteraktionen und sogar Projektil- oder Partikeleffekte gehören. Der Effekt wird häufig durch Anpassen der Bildrate des Spiels oder durch Manipulieren zeitbezogener Variablen im Spielcode erzielt.

Um im Spiel Unity einen Zeitlupeneffekt zu erzielen, müssen wir ein Skript schreiben, das den Wert von Time.timeScale und die Tonhöhe aller aktiven Audioquellen ändert.

Zeitlupe ist das Gegenteil von Zeitraffer und bezeichnet den Prozess der Verlangsamung der Spielgeschwindigkeit.

  • Erstellen ein neues Skript, nennen Sie es 'SC_SlowMotionEffect', entfernen Sie alles daraus und fügen Sie dann den folgenden Code ein:

SC_SlowMotionEffect.cs

using UnityEngine;

public class SC_SlowMotionEffect : MonoBehaviour
{
    public float slowMotionTimeScale = 0.5f;
    public bool slowMotionEnabled = false;

    [System.Serializable]
    public class AudioSourceData
    {
        public AudioSource audioSource;
        public float defaultPitch;
    }

    AudioSourceData[] audioSources;

    // Start is called before the first frame update
    void Start()
    {
        //Find all AudioSources in the Scene and save their default pitch values
        AudioSource[] audios = FindObjectsOfType<AudioSource>();
        audioSources = new AudioSourceData[audios.Length];

        for (int i = 0; i < audios.Length; i++)
        {
            AudioSourceData tmpData = new AudioSourceData();
            tmpData.audioSource = audios[i];
            tmpData.defaultPitch = audios[i].pitch;
            audioSources[i] = tmpData;
        }

        SlowMotionEffect(slowMotionEnabled);
    }

    // Update is called once per frame
    void Update()
    {
        //Activate/Deactivate slow motion on key press
        if (Input.GetKeyDown(KeyCode.Q))
        {
            slowMotionEnabled = !slowMotionEnabled;
            SlowMotionEffect(slowMotionEnabled);
        }
    }

    void SlowMotionEffect(bool enabled)
    {
        Time.timeScale = enabled ? slowMotionTimeScale : 1;
        for (int i = 0; i < audioSources.Length; i++)
        {
            if (audioSources[i].audioSource)
            {
                audioSources[i].audioSource.pitch = audioSources[i].defaultPitch * Time.timeScale;
            }
        }
    }
}

  • Hängen Sie das obige Skript an ein beliebiges GameObject an und drücken Sie dann 'Q' im Spiel, um den Zeitlupeneffekt zu aktivieren/deaktivieren.

Um sicherzustellen, dass Rigidbodies während des Zeitlupeneffekts reibungslos simuliert werden, stellen Sie ihren Interpolate-Wert auf „Interpolate“ oder „Extrapolate“ ein.