tutoriales.com

Creando un Sistema de Ciclo Día y Noche Dinámico con Cambios de Iluminación y Clima en Unity ☀️🌙

Descubre cómo programar un sistema de ciclo día y noche realista en Unity. Aprende a manipular la rotación de la luz direccional, cambiar los colores del cielo mediante gradientes y añadir efectos de clima atmosférico para tus mundos virtuales.

Intermedio9 min de lectura7 views
Reportar error

Introducción al Sistema de Ciclo Día y Noche 🌍

Crear un mundo vivo y respirable es uno de los objetivos más importantes para cualquier desarrollador de videojuegos. La implementación de un ciclo de día y noche no solo aporta realismo visual, sino que también afecta directamente a la jugabilidad, condicionando las mecánicas de supervivencia, la visibilidad y el comportamiento de la inteligencia artificial.

En este tutorial completo aprenderemos a construir desde cero un gestor temporal eficiente en Unity usando C#. Controlaremos la rotación del sol y la luna, ajustaremos la intensidad lumínica en tiempo real, modificaremos el color ambiental del cielo de forma suave y sentaremos las bases para integrar sistemas climáticos.

💡 Consejo: Este sistema está diseñado para ser ligero y modular, permitiendo ajustarlo tanto para proyectos low-poly como para juegos con un estilo gráfico más realista.

1. Planificación y Arquitectura del Sistema 📐

Antes de escribir código, es fundamental comprender cómo funcionará la arquitectura del ciclo. Utilizaremos un script central llamado TimeManager que mantendrá el control del tiempo en minutos del día (de 0 a 1440 minutos totales). Este valor guiará todos los cálculos de iluminación.

TimeManager Minutos del Día Controlador de Luz Direccional Gradiente del Cielo Gestor de Clima

Componentes Clave del Sistema

  • Reloj Interno: Mide el paso del tiempo acelerado o en tiempo real.
  • Luz Direccional Principal: Simula el Sol y la Luna mediante rotación en los ejes X e Y.
  • Skybox y Niebla: Cambian de color progresivamente según el ángulo del sol.
  • Gestor de Clima: Añade variabilidad como lluvia o niebla densa.

2. Programando el Controlador de Tiempo (TimeManager.cs) ⏱️

Comenzaremos creando el script que gestionará el avance de las horas. Abre tu proyecto en Unity, crea un nuevo archivo de C# llamado TimeManager y añade el siguiente código:

using UnityEngine;

public class TimeManager : MonoBehaviour
{
    [Header("Configuración del Tiempo")]
    [Range(0, 24)]
    public float horaActual = 12f;
    public float velocidadDelTiempo = 1f;
    
    [Header("Referencias")]
    public Light luzDireccional;
    public Gradient colorLuzSol;
    public Gradient colorAmbiente;

    private const float MINUTOS_EN_DIA = 1440f;
    private float segundosTranscurridos = 0f;

    void Update()
    {
        // Avanzar el tiempo basado en la velocidad configurada
        segundosTranscurridos += Time.deltaTime * velocidadDelTiempo * 10f;
        horaActual = (segundosTranscurridos / 60f) % 24f;

        ActualizarIluminacion();
    }

    void ActualizarIluminacion()
    {
        float porcentajeDia = horaActual / 24f;

        // Rotación del sol (360 grados en un día)
        float rotacionSolX = Mathf.Lerp(-90f, 270f, porcentajeDia);
        luzDireccional.transform.rotation = Quaternion.Euler(rotacionSolX, 170f, 0f);

        // Ajustar color de la luz y ambiente según el gradiente
        luzDireccional.color = colorLuzSol.Evaluate(porcentajeDia);
        RenderSettings.ambientLight = colorAmbiente.Evaluate(porcentajeDia);

        // Intensidad basada en si es de día o de noche
        if (horaActual > 6f && horaActual < 18f)
        {
            luzDireccional.intensity = Mathf.Lerp(0f, 1f, Mathf.Sin(porcentajeDia * Mathf.PI * 2f));
        }
        else
        {
            luzDireccional.intensity = 0.2f; // Luz suave de luna
        }
    }
}
📌 Nota: Asegúrate de arrastrar tu luz direccional principal al campo correspondiente en el Inspector de Unity una vez que hayas adjuntado este script a un GameObject vacío.

3. Configurando Gradientes de Iluminación y Ambiente 🎨

Para lograr una transición visualmente atractiva entre el amanecer, el mediodía, el atardecer y la noche, utilizaremos gradientes de color en el Inspector de Unity.

Tabla de Horarios y Tonos Recomendados

Momento del DíaHora Aprox.Color de Luz SugeridoColor AmbientalIntensidad del Sol
Madrugada04:00 - 06:00Azul Oscuro / VioletaAzul Muy Oscuro0.1
Amanecer06:00 - 08:00Naranja Cálido / DoradoNaranja Suave0.6
Mediodía12:00Blanco BrillanteBlanco Cálido1.0
Atardecer18:00 - 20:00Rojo Intenso / MagentaVioleta Cálido0.4
Noche20:00 - 04:00Azul Cetrino / PálidoAzul Noche0.2

Configura los gradientes en el componente TimeManager para que coincidan con estos valores y observa cómo tu escena cambia de tono suavemente a medida que avanza el reloj.


4. Integrando Efectos Atmosféricos y Clima 🌧️

Un ciclo dinámico está incompleto sin variaciones meteorológicas. Vamos a añadir un sistema básico para alternar entre clima despejado y lluvia.

Script WeatherManager.cs

Crea un nuevo script llamado WeatherManager y colócalo en tu escena:

using UnityEngine;

public class WeatherManager : MonoBehaviour
{
    public ParticleSystem sistemaLluvia;
    public Light luzDireccional;
    private bool estaLloviendo = false;

    void Start()
    {
        if (sistemaLluvia != null)
            sistemaLluvia.Stop();
    }

    public void CambiarClima()
    {
        estaLloviendo = !estaLloviendo;

        if (estaLloviendo)
        {
            if (sistemaLluvia != null) sistemaLluvia.Play();
            RenderSettings.fog = true;
            RenderSettings.fogDensity = 0.03f;
            luzDireccional.intensity *= 0.6f; // Oscurecer por nubes
            Debug.Log("Comenzó a llover.");
        }
        else
        {
            if (sistemaLluvia != null) sistemaLluvia.Stop();
            RenderSettings.fog = false;
            Debug.Log("El clima se despejó.");
        }
    }
}
Estado Despejado CambiarClima() Estado Lluvioso Activa Partículas Activa Niebla Reduce Intensidad Solar
⚠️ Advertencia: El uso excesivo de partículas de lluvia combinadas con niebla densa puede afectar el rendimiento en dispositivos móviles. Asegúrate de ajustar el límite de partículas en el sistema.

5. Optimizando el Rendimiento y Consejos Pro 🚀

Cuando trabajamos con sistemas que se ejecutan en cada fotograma (Update), es vital mantener la optimización al máximo para evitar caídas de fotogramas por segundo (FPS).

Prácticas Recomendadas

  • Optimización Actualización por Intervalos: En lugar de recalcular la iluminación cada fotograma, puedes actualizarla cada 0.2 segundos utilizando una corrutina.
  • Pro Bake de Iluminación: Si tu juego es de mundo abierto estático, recuerda combinar este sistema con sombras en tiempo real moderadas y utilizar Light Probes para los objetos dinámicos.
  • Escalabilidad Eventos de Tiempo: Utiliza eventos de C# (System.Action) en el TimeManager para notificar a otros scripts cuando ocurra un cambio de fase (por ejemplo, cuando se alcance la medianoche o amanezca).

Preguntas Frecuentes (FAQ)

¿Cómo puedo hacer que las luces artificiales (farolas) se enciendan automáticamente de noche? Puedes suscribirte a los eventos del `TimeManager` o verificar en un script de las farolas si horaActual > 19f || horaActual < 6f para activar el componente de luz correspondiente.
¿Puedo cambiar la duración real de un día en el juego? ¡Sí! Simplemente ajusta la variable velocidadDelTiempo desde el Inspector. Un valor de 1 hará que el día pase a una velocidad estándar, mientras que un valor mayor acelerará las horas.

Conclusión y Próximos Pasos 🎯

¡Felicidades! Has implementado con éxito un sistema completo de ciclo de día y noche en Unity con transiciones de luz, gradientes ambientales y un gestor de clima básico.

Paso 1: Configuración del script TimeManager y rotación solar.
Paso 2: Implementación de gradientes de color para amanecer y atardecer.
Paso 3: Integración del sistema de clima y niebla volumétrica.

Como siguientes pasos, te recomendamos experimentar añadiendo un sistema de ciclo lunar con fases visibles en el cielo o conectando este reloj con las rutinas diarias de los NPCs de tu juego. ¡Sigue creando y divirtiéndote con Unity!

Tutoriales relacionados

Comentarios (0)

Aún no hay comentarios. ¡Sé el primero!