Luzes piscantes são uma força poderosa na influência do tom de um ambiente. Por exemplo, uma casa com iluminação de brilho consistente pode parecer acolhedora e convidativa, mas se você adicionar luzes piscantes ao corredor da mesma casa, ele se torna assombroso e pode sugerir um perigo à frente. Ao modelar e scriptar estrategicamente diferentes fontes de luz dentro de sua experiência, você pode adicionar um novo nível à sua narrativa ambiental.
Assim como em toda criação 3D, existem muitas maneiras de alcançar qualquer objetivo específico. Neste guia, você pode rapidamente criar uma animação de luz piscante usando ferramentas e métodos disponíveis apenas no Studio com apenas alguns ativos básicos, incluindo um arquivo .rbxm para o modelo de lampada de banqueiro que contém partes filhas Class.MeshParts que você pode personalizar para se adequar à estética de suas próprias experiências.
No método a seguir para criar luzes piscantes, siga cada seção para aprender a criar:
- Um NumberSequence de brilho para influenciar o brilho da luminária ao longo do tempo.
- Um atributo de duração do loop para determinar a quantidade de tempo que cada ciclo de piscar deve levar.
Importar a lâmpada de exemplo
Este guia usa um arquivo .rbxm de uma lâmpada de banqueiro personalizável e de alta qualidade para demonstrar uma técnica de luz piscante. Você pode usar este modelo para entender os princípios básicos e, em seguida, aplicá-los aos seus próprios modelos que você criar dentro do Studio ou em outras ferramentas de modelagem de terceiros.
Para importar o modelo de lâmpada BankersLamp .rbxm:
Na janela Explorer, clique com o botão direito em Workspace. Um menu contextual será exibido.
Selecione Inserir a partir do Arquivo… Um navegador de arquivos será exibido.
Selecione o .rbxm BankersLamp, em seguida clique no botão Abrir. O modelo será exibido na visualização.
Criar um NumberSequence de brilho
Um NumberSequence é um tipo de dado que representa uma série de valores numéricos de 0 a 1 ao longo da vida de uma instância. Esse tipo de dado é útil para criar luzes piscantes porque você pode especificar como deseja que o brilho da luz da lâmpada mude ao longo de sua vida, e quando você muda o brilho de intensidade total para nenhuma luz em sucessão rápida, pode alcançar um efeito de cintilação.
O eixo X de um NumberSequence representa o tempo, e o eixo Y representa o brilho relativo. Cada quadrado no início e no final da sequência numérica é um ponto-chave que determina o valor da propriedade naquele ponto da vida do brilho da luz. Quando você cria pela primeira vez um NumberSequence, o gráfico é uma linha reta e a luz permanece com a mesma intensidade de brilho ao longo de sua vida, mas ao adicionar e mover pontos-chave, você pode criar curvas dentro da sequência e mudar o brilho da lâmpada ao longo do tempo.

Embora a lâmpada não tenha um NumberSequence de brilho por padrão, você pode criar um atributo de brilho, defini-lo como um tipo NumberSequence e, em seguida, experimentar adicionando pontos-chave com diferentes valores até que a luz pisque na cadência que você definir.
Para criar um NumberSequence de brilho:
Adicione um novo atributo NumberSequence ao modelo da lâmpada.
Na janela Explorer, selecione o modelo da lâmpada.
Na janela Properties, navegue até a seção Attributes e clique no botão Add Attribute. A caixa de diálogo Add Attribute será exibida.
Na caixa de diálogo Add Attribute,
No campo Name, insira BrightnessCurve.
Clique no menu suspenso Type e selecione NumberSequence.
Clique no botão Save. O novo atributo será exibido na seção Attributes da janela Properties.
Selecione a nova propriedade BrightnessCurve e clique no botão …. Um pop-up de sequência numérica será exibido.
Execute uma das seguintes ações:
- Para alterar o brilho em um ponto, clique em um ponto-chave e arraste-o para cima ou para baixo, ou insira um valor no campo Value.
- Para inserir novos pontos-chave, clique em qualquer ponto no gráfico.
- Para excluir um ponto-chave, selecione o ponto-chave e, em seguida, clique no botão Delete.
- Para adicionar um intervalo aleatório para o brilho, clique em qualquer ponto-chave e arraste as linhas do envelope para cima ou para baixo. Nesse momento, a luz gera um brilho aleatório entre o envelope rosa.
Por exemplo, o gráfico a seguir faz com que a luz pisque para o brilho total na primeira piscada, 50% de brilho na segunda piscada e 75% de brilho na terceira piscada.

Criar uma duração do loop
Agora que você tem um NumberSequence para determinar como o brilho da luz da lâmpada muda ao longo de sua vida, você deve determinar quanto tempo deseja que o ciclo de piscamento leve. Em outras palavras, essa duração do loop controla essencialmente com que frequência o NumberSequence se repete, em segundos.
Para criar uma duração do loop:
Adicione um novo atributo de duração do loop ao modelo da lâmpada.
Na janela Explorer, selecione o modelo da lâmpada.
Na janela Properties, navegue até a seção Attributes e clique no botão Add Attribute. A caixa de diálogo Add Attribute será exibida.
Na caixa de diálogo Add Attribute,
No campo Name, insira LoopDuration.
Clique no menu suspenso Type e selecione Number.
Clique no botão Save. O novo atributo será exibido na seção Attributes da janela Properties.
Defina o novo atributo LoopDuration como 1. Isso informa ao NumberSequence para repetir após um segundo.
Script para o piscar da luz
Agora que você possui todos os elementos para controlar o brilho da sua lâmpada ao longo de sua vida, é hora de criar um Script que reunirá tudo e fará a luz piscar.
Para scriptar o piscar da luz:
- Na janela Explorer, passe o mouse sobre o modelo da lâmpada e clique no botão ⊕. Um menu contextual será exibido.
- No menu, insira um Script.
- No novo script, insira o seguinte:
local RunService = game:GetService("RunService")
-- Obtém os valores dos atributos definidos no modelo.
local brightnessCurve = script.Parent:GetAttribute("BrightnessCurve")
local loopDuration = script.Parent:GetAttribute("LoopDuration")
-- Armazena referências às instâncias do modelo que vão mudar.
local light = script.Parent.lamp_hood.SpotLight
local bulb = script.Parent.lightbulb
local beam = script.Parent.lamp_hood.Beam
-- Armazena os valores originais das propriedades que vão mudar.
local origLightBrightness = light.Brightness
local origBeamBrightness = beam.Brightness
local origBulbColor = bulb.Color
-- Obtém o valor do NumberSequence (ns) em um tempo específico (nsTime)
function evaluateNumberSequence(ns: NumberSequence, nsTime: number)
-- Se estamos em 0 ou 1, retorna o valor do primeiro ou último ponto-chave, respectivamente.
if nsTime == 0 then
return ns.Keypoints[1].Value
end
if nsTime == 1 then
return ns.Keypoints[#ns.Keypoints].Value
end
-- Caso contrário, passa por cada par sequencial de pontos-chave.
for i = 1, #ns.Keypoints - 1 do
-- Obtém o ponto-chave atual e o próximo.
local currKp = ns.Keypoints[i]
local nextKp = ns.Keypoints[i + 1]
-- Se nsTime está entre os tempos dos pontos-chave,
if nsTime >= currKp.Time and nsTime < nextKp.Time then
-- Calcula onde nsTime está entre os tempos dos pontos-chave, chamando isso de alpha.
local alpha = (nsTime - currKp.Time) / (nextKp.Time - currKp.Time)
-- Retorna o valor entre os pontos para nsTime usando alpha.
return currKp.Value + (nextKp.Value - currKp.Value) * alpha
end
end
end
RunService.Heartbeat:Connect(function()
-- Resolve o tempo do NumberSequence (entre 0 e 1).
local t = time() / loopDuration
local numberSequenceTime = t - (t // 1)
-- Obtém o valor do NumberSequence neste momento.
local brightnessValue = evaluateNumberSequence(brightnessCurve, numberSequenceTime)
-- Ajusta as propriedades de brilho e cor com base neste valor.
light.Brightness = origLightBrightness * brightnessValue
beam.Brightness = origBeamBrightness * brightnessValue
bulb.Color = Color3.new(
origBulbColor.r * brightnessValue,
origBulbColor.g * brightnessValue,
origBulbColor.b * brightnessValue
)
end)
Quando você testar sua experiência, a conexão do evento Heartbeat executa o seguinte a cada quadro:
- Resolve um tempo (numberSequenceTime) dentro do brightnessCurve NumberSequence com base no tempo atual.
- O tempo está entre 0 e 1, pois estes representam o início e o fim do NumberSequence, respectivamente.
- Resolve o valor (brightnessValue) do brightnessCurve NumberSequence no tempo numberSequenceTime.
- evaluateNumberSequence() calcula o valor associado ao tempo para qualquer NumberSequence.
- Este valor serve como um valor de brilho relativo a ser aplicado às propriedades que mudam ao longo do tempo.
- Altera as propriedades das lâmpadas multiplicando brightnessValue pelo brilho da luz, brilho do feixe e cor da lâmpada.
As mudanças nessas propriedades ao longo do tempo resultam no efeito de piscar abaixo.