Efecto de cámara lenta en Unity

Alterar el ritmo de tiempo en Unity es bastante fácil, todo lo que necesitas hacer es cambiar el valor de Time.timeScale.

Time.timeScale es un valor en Unity que controla eventos dependientes del tiempo, como Actualizar funciones, animaciones, partículas, física, etc. Cuando timeScale es 1, el tiempo pasa tan rápido como en tiempo real, con 0.5 el tiempo pasa 2 veces más lento que en tiempo real, y con 2.0 el tiempo pasa el doble de rápido. Time.timeScale con el valor 0 detiene cualquier cálculo dependiente de la velocidad de fotogramas, los valores negativos se ignoran.

Sin embargo, solo establecer el valor de timeScale no es suficiente para crear un efecto de cámara lenta creíble.

Algunos componentes como AudioSource no se ven afectados por el tiempo, pero afortunadamente, cambiar su tono es suficiente para agregar un efecto de cámara lenta al audio.

La cámara lenta en los juegos se refiere a un efecto visual y, a veces, funcional en el que la jugabilidad, los gráficos y las animaciones se ralentizan para crear una experiencia dramática y estilizada. Se utiliza para enfatizar momentos clave, mejorar el control del jugador o agregar un estilo cinematográfico a las secuencias de juego.

Cuando el juego está en cámara lenta, todo parece moverse a una velocidad reducida en comparación con el juego normal. Esto puede incluir movimientos de personajes, interacciones ambientales e incluso efectos de proyectiles o partículas. El efecto a menudo se logra ajustando la velocidad de fotogramas del juego o manipulando variables relacionadas con el tiempo en el código del juego.

Para hacer un efecto de cámara lenta en el juego Unity, necesitaremos escribir un script que cambie el valor de Time.timeScale y cambiar el tono de todas las fuentes de audio activas.

La cámara lenta es lo opuesto a la cámara rápida y es el proceso de ralentizar la velocidad del juego.

  • Cree un nuevo script, llámelo 'SC_SlowMotionEffect', elimine todo y luego pegue el siguiente código dentro de él:

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;
            }
        }
    }
}

  • Adjunte el script anterior a cualquier GameObject y luego presione 'Q' en el juego para activar/desactivar el efecto de cámara lenta.

Para asegurarse de que Rigidbodies se simulen sin problemas durante el efecto de cámara lenta, establezca su valor de Interpolación en Interpolar o Extrapolar.