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.
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.
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.
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
}
}
}
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ía | Hora Aprox. | Color de Luz Sugerido | Color Ambiental | Intensidad del Sol |
|---|---|---|---|---|
| Madrugada | 04:00 - 06:00 | Azul Oscuro / Violeta | Azul Muy Oscuro | 0.1 |
| Amanecer | 06:00 - 08:00 | Naranja Cálido / Dorado | Naranja Suave | 0.6 |
| Mediodía | 12:00 | Blanco Brillante | Blanco Cálido | 1.0 |
| Atardecer | 18:00 - 20:00 | Rojo Intenso / Magenta | Violeta Cálido | 0.4 |
| Noche | 20:00 - 04:00 | Azul Cetrino / Pálido | Azul Noche | 0.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ó.");
}
}
}
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 elTimeManagerpara 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 sihoraActual > 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 variablevelocidadDelTiempo 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.
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
- Creando un Sistema de Guardado y Carga Universal en Unity: Persistencia de Datos para tus Juegos 💾intermediate25 min
- Creando un Sistema de Menús Interactivos y Navegación UI en Unity para tus Juegos 🎮intermediate25 min
- Creando un Sistema de Crafteo y Recetas Dinámico en Unity para Juegos de Supervivencia y RPG 🛠️intermediate20 min
- Optimización Avanzada de Rendimiento en Unity: Sacando el Máximo a tus Juegos 🚀intermediate18 min
- Creando un Sistema de Cámaras Cinematográficas con Cinemachine en Unity 🎬intermediate20 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!