Luces parpadeantes es una poderosa fuerza que influye en el tono de un entorno. Por ejemplo, un hogar con una iluminación de brillo constante puede sentirse cálido y acogedor, pero si agregas luces parpadeantes al pasillo de ese mismo hogar, se vuelve inquietante y podría insinuar un posible peligro adelante. Al modelar y programar estratégicamente diferentes fuentes de luz dentro de tu experiencia, puedes agregar un nuevo nivel a tu narrativa ambiental.
Al igual que con toda creación 3D, hay muchas maneras de lograr cualquier objetivo particular. En esta guía, puedes crear rápidamente una animación de luz parpadeante utilizando herramientas y métodos disponibles solo dentro de Studio con solo unos pocos activos básicos, incluido un archivo .rbxm para el modelo de lámpara de banquero que contiene partes Class.MeshParts que puedes personalizar para adaptarse a la estética de tus propias experiencias.
En el siguiente método para crear luces parpadeantes, sigue cada sección para aprender a crear:
- Una NumberSequence de brillo para influir en el brillo de la lámpara a lo largo del tiempo.
- Un atributo de duración de bucle para determinar la cantidad de tiempo que debe durar cada bucle de parpadeo.
Importar la lámpara de muestra
Esta guía utiliza un archivo .rbxm descargable de un modelo de lámpara de banquero altamente personalizable para demostrar una técnica de luz parpadeante. Puedes utilizar este modelo para comprender los principios básicos y luego aplicarlos a tus propios modelos que crees dentro de Studio u otro software de modelado de terceros.
Para importar la lámpara BankersLamp .rbxm:
En la ventana de Explorer, haz clic derecho en Workspace. Se muestra un menú contextual.
Selecciona Insertar Desde Archivo… Se muestra un explorador de archivos.
Selecciona la lámpara BankersLamp .rbxm, luego haz clic en el botón Abrir. El modelo se muestra dentro del viewport.
Crear una NumberSequence de brillo
Una NumberSequence es un tipo de dato que representa una serie de valores numéricos de 0 a 1 a lo largo de la vida de una instancia. Este tipo de dato es útil para crear luces parpadeantes porque puedes especificar cómo deseas que el brillo de la luz de la lámpara cambie a lo largo de su vida, y cuando cambias el brillo de la máxima intensidad a ninguna luz en sucesión corta, puedes lograr un efecto de parpadeo.
El eje X de una NumberSequence representa el tiempo, y el eje Y representa el brillo relativo. Cada cuadrado al comienzo y al final de la secuencia de números es un punto clave que determina el valor de la propiedad en ese punto de la vida del brillo de la luz. Cuando creas por primera vez una NumberSequence, el gráfico es una línea recta y la luz permanece con la misma intensidad de brillo a lo largo de su vida, pero al agregar y mover puntos clave, puedes crear curvas dentro de la secuencia y cambiar el brillo de la lámpara a lo largo del tiempo.

Aunque la lámpara no tiene una NumberSequence de brillo por defecto, puedes crear un atributo de brillo, establecerlo como un tipo NumberSequence, y luego experimentar agregando puntos clave con diferentes valores hasta que la luz parpadee a tu cadencia establecida.
Para crear una NumberSequence de brillo:
Agrega un nuevo atributo NumberSequence al modelo de la lámpara.
En la ventana de Explorer, selecciona el modelo de la lámpara.
En la ventana de Properties, navega a la sección de Attributes y haz clic en el botón Agregar Atributo. Se muestra el diálogo Agregar Atributo.
En el diálogo Agregar Atributo,
En el campo Nombre, ingresa BrightnessCurve.
Haz clic en el menú desplegable Tipo, luego selecciona NumberSequence.
Haz clic en el botón Guardar. El nuevo atributo se muestra en la sección de Attributes de la ventana de Properties.
Selecciona la nueva propiedad BrightnessCurve, luego haz clic en el botón …. Se muestra un pop-up de número de secuencia.
Realiza una de las siguientes acciones:
- Para cambiar el brillo en un punto, haz clic en un punto clave y arrástralo hacia arriba o hacia abajo, o ingresa un valor en el campo Valor.
- Para insertar nuevos puntos clave, haz clic en cualquier punto en el gráfico.
- Para eliminar un punto clave, selecciona el punto clave, luego haz clic en el botón Eliminar.
- Para agregar un rango aleatorio de brillo, haz clic en cualquier punto clave y arrastra las líneas del sobre hacia arriba o hacia abajo. En ese momento, la luz genera un brillo aleatorio entre el sobre rosa.
Por ejemplo, el siguiente gráfico hace que la luz parpadee a máxima brillantez en el primer parpadeo, 50% de brillo en el segundo parpadeo, y luego 75% de brillo en el tercer parpadeo.

Crear una duración de bucle
Ahora que tienes una NumberSequence para determinar cómo cambia el brillo de la luz de la lámpara a lo largo de su vida, debes determinar cuánto tiempo quieres que dure el bucle de parpadeo. En otras palabras, esta duración de bucle controla esencialmente con qué frecuencia se repite la NumberSequence, en segundos.
Para crear una duración de bucle:
Agrega un nuevo atributo de duración de bucle al modelo de la lámpara.
En la ventana de Explorer, selecciona el modelo de la lámpara.
En la ventana de Properties, navega a la sección de Attributes y haz clic en el botón Agregar Atributo. Se muestra el diálogo Agregar Atributo.
En el diálogo Agregar Atributo,
En el campo Nombre, ingresa LoopDuration.
Haz clic en el menú desplegable Tipo, luego selecciona Number.
Haz clic en el botón Guardar. El nuevo atributo se muestra en la sección de Attributes de la ventana de Properties.
Establece el nuevo atributo LoopDuration en 1. Esto le dice a la NumberSequence que se repita después de un segundo.
Programar el parpadeo de la luz
Ahora que tienes todos los elementos para controlar el brillo de tu lámpara a lo largo de su vida, es hora de crear un Script que hará que todo funcione junto y parpadee la luz.
Para programar el parpadeo de la luz:
- En la ventana de Explorer, desplázate sobre el modelo de la lámpara y haz clic en el botón ⊕. Se muestra un menú contextual.
- En el menú, inserta un Script.
- En el nuevo script, ingresa lo siguiente:
local RunService = game:GetService("RunService")
-- Obtiene los valores de atributos establecidos en el modelo.
local brightnessCurve = script.Parent:GetAttribute("BrightnessCurve")
local loopDuration = script.Parent:GetAttribute("LoopDuration")
-- Almacena referencias a las instancias del modelo que cambiarán.
local light = script.Parent.lamp_hood.SpotLight
local bulb = script.Parent.lightbulb
local beam = script.Parent.lamp_hood.Beam
-- Almacena los valores originales de las propiedades que cambiarán.
local origLightBrightness = light.Brightness
local origBeamBrightness = beam.Brightness
local origBulbColor = bulb.Color
-- Obtiene el valor de la NumberSequence (ns) en un tiempo específico (nsTime)
function evaluateNumberSequence(ns: NumberSequence, nsTime: number)
-- Si estamos en 0 o 1, devuelve el valor del primer o último punto clave, respectivamente.
if nsTime == 0 then
return ns.Keypoints[1].Value
end
if nsTime == 1 then
return ns.Keypoints[#ns.Keypoints].Value
end
-- De lo contrario, itera a través de cada par secuencial de puntos clave.
for i = 1, #ns.Keypoints - 1 do
-- Obtiene el punto clave actual y el siguiente.
local currKp = ns.Keypoints[i]
local nextKp = ns.Keypoints[i + 1]
-- Si nsTime está entre los tiempos de los puntos clave,
if nsTime >= currKp.Time and nsTime < nextKp.Time then
-- Calcula dónde se encuentra nsTime entre los tiempos de los puntos clave, llama esto alpha.
local alpha = (nsTime - currKp.Time) / (nextKp.Time - currKp.Time)
-- Devuelve el valor entre los puntos para nsTime usando alpha.
return currKp.Value + (nextKp.Value - currKp.Value) * alpha
end
end
end
RunService.Heartbeat:Connect(function()
-- Resuelve el tiempo de la NumberSequence (entre 0 y 1).
local t = time() / loopDuration
local numberSequenceTime = t - (t // 1)
-- Obtiene el valor de la NumberSequence en este tiempo.
local brightnessValue = evaluateNumberSequence(brightnessCurve, numberSequenceTime)
-- Ajusta las propiedades de brillo y color en función de este valor.
light.Brightness = origLightBrightness * brightnessValue
beam.Brightness = origBeamBrightness * brightnessValue
bulb.Color = Color3.new(
origBulbColor.r * brightnessValue,
origBulbColor.g * brightnessValue,
origBulbColor.b * brightnessValue
)
end)
Cuando pruebes tu experiencia, la conexión del evento Heartbeat ejecuta lo siguiente cada cuadro:
- Resuelve un tiempo (numberSequenceTime) dentro de la brightnessCurve NumberSequence basado en el tiempo actual.
- El tiempo está entre 0 y 1, ya que representan el comienzo y el final de la NumberSequence, respectivamente.
- Resuelve el valor (brightnessValue) de la brightnessCurve NumberSequence en el tiempo numberSequenceTime.
- evaluateNumberSequence() calcula el valor asociado con el tiempo para cualquier NumberSequence.
- Este valor sirve como un valor de brillo relativo que se aplica a las propiedades que cambian con el tiempo.
- Cambia las propiedades de las lámparas multiplicando brightnessValue por el brillo de la luz, el brillo del haz y el color de la bombilla.
Los cambios en estas propiedades a lo largo del tiempo resultan en el efecto de parpadeo a continuación.