Unreal Engine: Creando un Sistema de Ciclismo Día/Noche Dinámico con Blueprint
Este tutorial te guiará paso a paso en la creación de un sistema de ciclo día/noche dinámico en Unreal Engine. Aprenderás a configurar la iluminación, el cielo, el sol, la luna y las estrellas, y a programar su comportamiento para que el tiempo avance de manera fluida y realista.
🌅 Introducción al Ciclo Día/Noche en Unreal Engine
Crear un ciclo de día y noche es fundamental para muchos juegos, ya que añade realismo, inmersión y variedad a los entornos. No solo afecta la iluminación visual, sino que también puede influir en la jugabilidad, el comportamiento de la IA y la atmósfera general de tu mundo.
En este tutorial, exploraremos cómo construir un sistema robusto y personalizable utilizando los potentes Blueprints de Unreal Engine. Cubriremos la configuración del sol, la luna, las estrellas, la iluminación global y el cielo dinámico para lograr una transición suave y creíble entre el día y la noche.
🛠️ Requisitos y Preparación del Proyecto
Antes de empezar, asegúrate de tener Unreal Engine 5 (o una versión similar) instalado. Utilizaremos el template de 'Third Person' o 'Blank' para este tutorial. No es necesario ningún plugin adicional, todo se hará con las herramientas nativas del motor.
📦 Configuración Inicial del Nivel
-
Crear un Nuevo Proyecto: Abre Unreal Engine y crea un nuevo proyecto de juego. Elige el template
Third PersonoBlanky asegúrate de que esté configurado paraBlueprintyStarter Content(aunque no lo usaremos directamente, no está de más tenerlo). -
Eliminar Elementos Innecesarios: Si estás usando un template como
Third Person, puede que ya tengas un Directional Light y Sky Light. Para empezar de cero con nuestro sistema dinámico, es recomendable eliminarlos. SeleccionaDirectionalLightySkyLighten el panelOutlinery presiona Supr.⚠️ Advertencia: Asegúrate de eliminar solo los componentes de luz para evitar errores en la jugabilidad si usas un template de juego. -
Añadir un Sky Atmosphere: Este componente es crucial para simular el efecto atmosférico de la luz solar. En el
Modes Panel(oPlace Actors), buscaSky Atmospherey arrástralo a tu nivel. -
Añadir un Volumetric Cloud: Para nubes dinámicas, busca
Volumetric Cloudy añádelo a tu nivel. Este componente interactúa con el Sky Atmosphere y la luz direccional para crear nubes realistas. -
Añadir un Exponential Height Fog: Para añadir profundidad y atmósfera, busca
Exponential Height Fogy arrástralo al nivel.
📈 Resumen de Componentes Iniciales
| Componente | Propósito |
|---|---|
| --- | --- |
| Sky Atmosphere | Simulación de la atmósfera terrestre. |
| Volumetric Cloud | Nubes dinámicas y volumétricas. |
| --- | --- |
| Exponential Height Fog | Efecto de niebla ambiental y profundidad. |
| BP_SkySphere (Opcional) | Reemplazaremos esto con un Sky Sphere personalizado. |
✨ Creando el Actor del Ciclo Día/Noche (BP_TimeOfDaySystem)
Vamos a crear un Blueprint que contendrá toda la lógica para nuestro sistema de día y noche. Este será el cerebro de nuestro ciclo temporal.
-
Crear Nuevo Blueprint Actor: En la carpeta
Content Browser, haz clic derecho y seleccionaBlueprint Class. EligeActorcomo clase padre y nómbraloBP_TimeOfDaySystem. -
Abrir BP_TimeOfDaySystem: Haz doble clic para abrirlo.
☀️ Componentes Esenciales del BP_TimeOfDaySystem
Dentro de BP_TimeOfDaySystem, añadiremos los siguientes componentes:
- Directional Light (Sol): Este componente representará el sol. En el panel
Components, haz clic enAddy buscaDirectional Light. NómbraloSunLight.- Asegúrate de marcar
Atmosphere Sun Lighten los detalles deSunLightpara que interactúe correctamente con elSky Atmosphere.
- Asegúrate de marcar
- Directional Light (Luna): Sí, usaremos otro
Directional Lightpara la luna, pero lo configuraremos de manera diferente. NómbraloMoonLight.- Desmarca
Atmosphere Sun LightparaMoonLight, ya que la luna no es una fuente de luz atmosférica principal. EnDetails, ajusta elLight Colora un azul oscuro o grisáceo.
- Desmarca
- Sky Light: Este componente captura la iluminación del cielo y la aplica al entorno. Nómbralo
SkyLightComp.- En
Details, asegúrate de queSource Typeesté enSLS Captured Scene.
- En
- Static Mesh (Esfera del Cielo): En lugar de usar el
BP_SkySpherepredeterminado, crearemos el nuestro para mayor control. Añade unStatic Mesh Componenty nómbraloSkySphereMesh.- Asigna una esfera (
EditorSphereo similar) comoStatic Mesh. - Desactiva
Cast ShadowsparaSkySphereMeshy, enDetails>Rendering, desactivaVisiblesi lo vamos a controlar con un Material dinámico.
- Asigna una esfera (
- Post Process Volume (Opcional, pero recomendado): Para controlar efectos de bloom, exposición, y colores. Añade un
Post Process Volumey nómbraloPostProcessVolumeComp.- En
Details, marcaInfinite Extent (Unbound)para que afecte a todo el nivel.
- En
🌐 Configuración del Sky Atmosphere
Dentro de BP_TimeOfDaySystem, selecciona Sky Atmosphere en los Components. En sus Details, en la sección Atmosphere:
- Asegúrate de que
Sun Lightesté asignado aSunLight(nuestroDirectional Lightdel sol). -
🔥 Importante: Para que el `Sky Atmosphere` funcione correctamente, el `Directional Light` (SunLight) debe ser el *único* con la opción `Atmosphere Sun Light` activada.
⚙️ Lógica de Control del Tiempo (Blueprint)
Ahora, implementaremos la lógica en Blueprint para que el tiempo avance y los elementos de luz se muevan y cambien de intensidad.
⏰ Variables de Tiempo
Vamos a necesitar algunas variables para controlar el ciclo:
- CurrentTime (Float): Representa la hora actual del día, de 0.0 (medianoche) a 24.0 (medianoche). Marcar
Expose on SpawnyInstance Editablepara poder ajustarlo desde el nivel. - DayCycleLengthInMinutes (Float): Duración de un día completo en minutos reales. Marcar
Expose on SpawnyInstance Editable. Valor predeterminado:10.0(un día dura 10 minutos). - TimeScale (Float): Un multiplicador para la velocidad del tiempo. Calculado internamente.
- MoonPhase (Float): 0.0 a 1.0 para controlar las fases de la luna. (Opcional, para mayor complejidad).
🔄 Event Tick: El Corazón del Sistema
En el Event Graph de BP_TimeOfDaySystem, usaremos el Event Tick para actualizar el tiempo continuamente.
-
Calcular TimeScale: En
Event BeginPlay(o una funciónInitialize), calculaTimeScale:TimeScale = 24.0 / DayCycleLengthInMinutes / 60.0(Esto convierte los minutos reales a unidades de tiempo de 24 horas por segundo). -
Actualizar CurrentTime: En
Event Tick:- Añade
Delta SecondsaCurrentTimemultiplicado porTimeScale. - Usa el nodo
FMod(CurrentTimemodulo24.0) para mantenerCurrentTimedentro del rango de 0 a 24.
- Añade
🌞 Movimiento del Sol y la Luna
El movimiento del sol y la luna se basa en la rotación de los Directional Light.
- Calcular Rotación: En
Event Tick, después de actualizarCurrentTime:- Convierte
CurrentTimea un ángulo de rotación. Un día completo (24 horas) es 360 grados. Así que,RotationAngle = CurrentTime * 15.0(360/24 = 15). - Para el sol, queremos que esté alto al mediodía (hora 12). La rotación del
Directional Lighten el ejeY(Pitch) es la que determina su altura. Queremos que 0 grados sea mediodía (sol arriba) y 180 grados sea medianoche (sol abajo). - Usa un nodo
Map Range ClampedoLerppara mapearCurrentTime(0-24) a un rango de rotación, por ejemplo, de -90 a 270 grados en el eje Pitch.
- Convierte
-
Aplicar Rotación al Sol:
- Usa
Set Actor RotationparaSunLight. Establece el Pitch (Y) con el ángulo calculado. Mantén Roll (X) y Yaw (Z) a 0 o según el punto cardinal de salida/puesta que desees.
- Usa
-
Aplicar Rotación a la Luna:
- La luna debe estar en la posición opuesta al sol. Simplemente añade 180 grados al ángulo Pitch del sol, o invierte la dirección de mapeo.
- Usa
Set Actor RotationparaMoonLightcon el ángulo de la luna.
💡 Intensidad de Luz y Color
La intensidad y el color del sol y la luna deben cambiar con la hora del día.
-
Intensidad del Sol:
- Crea una
Curve (Float)en elContent Browser(clic derecho ->Miscellaneous->Curve->CurveFloat). NómbralaSunIntensityCurve. - Abre
SunIntensityCurve. Añade puntos clave:(0, 0),(6, 0.1),(12, 10),(18, 0.1),(24, 0). Ajusta los valores de intensidad según tu preferencia.(12, 10)significa 10 de intensidad al mediodía. Puedes experimentar con valores más altos o más bajos. - En
Event Tick, usaGet Float ValuedelSunIntensityCurveconCurrentTimecomo entrada. Conecta el resultado aSet IntensitydelSunLight.
- Crea una
-
Color del Sol (Opcional, pero recomendado):
- Crea una
Curve (Vector)(CurveVector). NómbralaSunColorCurve. - Añade puntos clave en
SunColorCurvepara simular amaneceres, atardeceres y mediodías. Por ejemplo:Key 0 (Medianoche): R(0.01), G(0.01), B(0.01)(casi negro)Key 5 (Amanecer): R(1.0), G(0.5), B(0.2)(naranja rojizo)Key 12 (Mediodía): R(1.0), G(1.0), B(1.0)(blanco puro)Key 19 (Atardecer): R(1.0), G(0.5), B(0.2)(naranja rojizo)Key 24 (Medianoche): R(0.01), G(0.01), B(0.01)
- En
Event Tick, usaGet Vector ValuedelSunColorCurveconCurrentTime. Conecta aSet Light ColordelSunLight.
- Crea una
-
Intensidad y Color de la Luna:
- La luna es más simple. Su intensidad será máxima por la noche y nula de día. Puedes usar la misma lógica de
SunIntensityCurvepero invertida o una curva separada (MoonIntensityCurve). - Para el color, un azul pálido o un gris claro suele funcionar bien. Puedes usar
Set Light Colorcon un color fijo o unaCurveVectorespecífica para la luna.
- La luna es más simple. Su intensidad será máxima por la noche y nula de día. Puedes usar la misma lógica de
🌌 Actualización del Sky Light
El Sky Light es crucial para la iluminación ambiental. Debe actualizarse para reflejar los cambios en el cielo.
- En
Event Tick, después de actualizar el sol y la luna, añade un nodoRecapture SkyalSkyLightComp.⚠️ Advertencia: Recapturar el Sky Light en cada tick puede ser costoso en rendimiento. Considera hacerlo menos frecuentemente (ej. cada 0.5 segundos) o solo cuando la intensidad de luz cambie significativamente para juegos con rendimiento crítico.
☁️ Controlando el Cielo y las Nubes
Para un ciclo día/noche completo, no solo movemos las luces, sino que también adaptamos la apariencia del cielo y las nubes.
🌍 Sky Atmosphere
El componente Sky Atmosphere reacciona automáticamente a la posición y color del SunLight (si está marcado como Atmosphere Sun Light). Sin embargo, puedes ajustar ciertos parámetros dinámicamente si lo deseas:
- Rayleigh Scattering: Afecta al color azul del cielo.
- Mie Scattering: Afecta a la dispersión de la luz y el halo alrededor del sol.
Para un control más avanzado, puedes crear un Dynamic Material Instance para el Sky Atmosphere y ajustar sus parámetros directamente desde Blueprint. Sin embargo, para este tutorial, la configuración por defecto y la interacción con SunLight serán suficientes para un efecto realista.
🌫️ Exponential Height Fog
La niebla también debe adaptarse. Generalmente, es más densa y visible durante la noche o al amanecer/atardecer.
- Fog Density: Puedes usar una
CurveFloatsimilar a la intensidad del sol, pero invertida, para que la densidad sea mayor de noche. - Fog Inscattering Color: Cambia el color de la niebla para que se vea más azulada de noche y más cálida de día.
- Start Distance: Ajusta la distancia a la que la niebla comienza a ser visible.
☁️ Volumetric Clouds
El Volumetric Cloud se ajusta en gran medida automáticamente con los cambios de luz. Sin embargo, puedes hacer más dinámicas las nubes:
- Cloud Opacity: Puedes reducir la opacidad de las nubes durante la noche o con mal tiempo.
- Material Parameters: Si creas un material personalizado para tus nubes volumétricas, puedes exponer parámetros para controlar la densidad, el tipo de nube o incluso la velocidad del viento, y actualizarlos a través de Blueprint.
🌟 Estrellas y Efectos Nocturnos
Para una noche convincente, necesitamos estrellas y, opcionalmente, una vía láctea.
🌠 Material para las Estrellas
-
Crear Material: En
Content Browser, clic derecho ->Material. NómbraloM_Stars. -
Configurar Material:
- Cambia
Blend ModeaAdditive. - Cambia
Shading ModelaUnlit. - Para la textura, puedes importar una textura de estrellas o generar una simple con ruido.
- Usa un nodo
Texture Samplecon tu textura de estrellas. - Conecta la salida
RGBdelTexture SampleaEmissive Color. - Añade un parámetro
ScalarllamadoStarVisibilityy multiplícalo por elEmissive Color. Esto nos permitirá controlar la visibilidad de las estrellas desde Blueprint.
- Cambia
🌌 Aplicar Estrellas al SkySphereMesh
- Asignar Material: En
BP_TimeOfDaySystem, seleccionaSkySphereMesh. - En
Details, en la secciónMaterials, asignaM_Starsal slot de material.
💫 Control de Visibilidad de Estrellas desde Blueprint
-
Crear Dynamic Material Instance: En
Event BeginPlaydeBP_TimeOfDaySystem:Create Dynamic Material InstancedelSkySphereMesh(M_Stars). Guarda la referencia en una variable (SkyStarsMID).
-
Actualizar StarVisibility: En
Event Tick:- Usa una
CurveFloat(StarVisibilityCurve) para controlarStarVisibilityen función deCurrentTime.- Ejemplo:
(0, 1),(6, 0),(18, 0),(24, 1)(visibles de noche, invisibles de día).
- Ejemplo:
- Usa
Set Scalar Parameter ValueenSkyStarsMIDcon el nombreStarVisibilityy el valor de la curva.
- Usa una
🎨 Ajustes Finales y Post-Procesado
Para pulir nuestro sistema, ajustaremos la exposición, el bloom y otros efectos visuales.
📸 Post Process Volume
Selecciona el PostProcessVolumeComp en BP_TimeOfDaySystem.
- Exposición:
- En
Details>Exposure>Meter Mode, seleccionaManual. - Crea una
CurveFloatllamadaExposureCurve. - Define puntos clave:
(0, -2)(noche oscura),(6, 0)(amanecer),(12, 1)(mediodía brillante),(18, 0)(atardecer),(24, -2). - En
Event Tick, usaSet Post Process SettingsenPostProcessVolumeCompy conecta el valor de laExposureCurvealExposure Compensation.
- En
- Bloom: Ajusta la intensidad del bloom para que sea más pronunciado de noche (luces de la ciudad, luna) y más sutil de día.
- Color Grading: Puedes usar
Color Gradingpara cambiar el tinte general del mundo, por ejemplo, un ligero tono azulado por la noche.
🔄 Recapitulación del Event Tick
Tu Event Tick en BP_TimeOfDaySystem debería seguir este flujo:
- Actualizar
CurrentTime. - Calcular y Aplicar Rotación a
SunLightyMoonLight. - Calcular y Aplicar Intensidad y Color a
SunLightyMoonLightusandoCurves. - Actualizar el
SkyLightComp(Recapture Sky). - Actualizar Visibilidad de Estrellas en
SkyStarsMID. - Actualizar Post Process Settings (exposición, bloom, etc.) en
PostProcessVolumeComp. - Actualizar parámetros de niebla (
Exponential Height Fog) y nubes (Volumetric Cloud) (Opcional, si has expuesto parámetros).
¿Por qué usar curvas para los valores?
Las curvas te permiten un control visual y preciso sobre cómo cambian los valores a lo largo del día. Puedes ajustar fácilmente el amanecer, el mediodía o el atardecer con gran granularidad sin tocar el código Blueprint.✅ Probando y Optimizando
Una vez que hayas implementado toda la lógica, arrastra una instancia de BP_TimeOfDaySystem a tu nivel. Puedes ajustar CurrentTime y DayCycleLengthInMinutes directamente en el panel Details del actor para ver los cambios rápidamente.
- Rendimiento:
Recapture Skyen cada tick puede ser costoso. Para optimizar, considera llamar aRecapture Skysolo cuando elSunLighthaya rotado un cierto ángulo, o cada X segundos. Lo mismo aplica para actualizaciones de materiales complejos. ParaDirectional LightySky Light, asegúrate de queMobilityesté enMovable. - Estética: Dedica tiempo a ajustar las curvas de intensidad, color y exposición. Pequeños ajustes pueden tener un gran impacto visual. Experimenta con diferentes texturas de estrellas y materiales de nubes.
- Añadir Audio: Para una inmersión completa, considera añadir sonidos ambientales que cambien entre día y noche (cantos de pájaros, grillos, viento).
¡Felicidades! Has creado un sistema de ciclo día/noche dinámico y personalizable en Unreal Engine. Esto sienta las bases para un mundo de juego mucho más vivo y reactivo.
Tutoriales relacionados
- Unreal Engine: Implementando IA Básica con Behaviour Trees y EQS para Enemigosintermediate15 min
- Unreal Engine: Creando Interactividad con el Sistema de Interacciones Basado en Componentesintermediate15 min
- Unreal Engine: Creación de un Sistema de Carga/Guardado de Partidas con SaveGame y Blueprintintermediate18 min
- Unreal Engine: Creación de un Sistema de Diálogos Ramificados con Data Tables y Blueprintintermediate15 min
- Creación de un Sistema de Progresión de Habilidades (Skill Tree) en Unreal Engine 5intermediate18 min
Comentarios (0)
Aún no hay comentarios. ¡Sé el primero!