閃爍的燈光 是影響環境氛圍的強大力量。例如,一個燈光明亮度一致的家會感覺溫暖和迷人,但如果您在同一個家中的走廊中添加閃爍的燈光,它將變得陰森,可能暗示著前方潛在的危險。通過在您的體驗中策略性地建模和編寫不同的光源,您可以為環境故事增添全新的層次。
與所有3D創作一樣,達成任何特定目標的方法有很多。在本指南中,您可以僅使用Studio內部可用的幾種基本資源快速創建閃爍燈光動畫,包括一個包含子Class.MeshParts的銀行家燈模型的.rbxm文件,您可以自定義以符合您自己體驗的美學。
在以下創建閃爍燈光的方法中,請按照每個部分了解如何創建:
- 一個亮度NumberSequence以影響燈泡隨時間的亮度。
- 一個循環持續時間屬性來確定每個閃爍循環必須花費的時間。
匯入示例燈具
本指南使用可下載的高質量、自定義的銀行家燈模型的.rbxm文件來演示閃爍燈光技術。您可以使用這個模型來瞭解基本原則,然後將其應用到您在Studio或其他第三方建模軟件中創建的模型上。
要匯入BankersLamp .rbxm:
在資源管理器窗口中,右鍵單擊工作區。會顯示一個上下文菜單。
選擇從文件插入… 會顯示文件瀏覽器。
選擇BankersLamp .rbxm,然後單擊打開按鈕。該模型將在視口中顯示。

創建亮度 NumberSequence
NumberSequence是一種數據類型,表示從0到1在實例壽命內的一系列數值。這種類型的數據類型適用於創建閃爍燈光,因為您可以指定燈光亮度在其壽命內如何變化,而當您在短時間內將亮度從滿強度變為完全無光時,可以實現閃爍效果。
NumberSequence的X軸表示時間,Y軸表示相對亮度。數列的開始和結束的每個方塊都是一個關鍵點,決定了燈光亮度在那個時間點的屬性值。當您第一次創建NumberSequence時,圖形是一條直線,燈光在其壽命內保持相同的亮度強度,但通過添加和移動關鍵點,您可以在序列內創建曲線,並隨著時間的推移改變燈的亮度。

雖然燈具默認情況下沒有亮度NumberSequence,但您可以創建一個亮度屬性,將其設置為NumberSequence類型,然後通過添加具有不同值的關鍵點來進行實驗,直到燈光按您的設置節奏閃爍。
要創建亮度 NumberSequence:
為燈具模型添加新的 NumberSequence 屬性。
在資源管理器窗口中,選中燈具模型。
在屬性窗口中,導航到屬性部分並單擊添加屬性按鈕。將顯示添加屬性對話框。
在 添加屬性 對話框中,
在 名稱 欄位中,輸入 BrightnessCurve。
單擊 類型 下拉菜單,然後選擇 NumberSequence。
單擊 保存 按鈕。新屬性將在屬性窗口的屬性部分中顯示。

選擇新的BrightnessCurve屬性,然後單擊**…**按鈕。會顯示一個數字序列彈出窗口。

执行以下操作之一:
- 要在某個點改變亮度,單擊一個關鍵點,然後上下拖動,或在值欄中輸入一個值。
- 要插入新的關鍵點,單擊圖表中的任意點。
- 要刪除一個關鍵點,選擇該關鍵點,然後單擊刪除按鈕。
- 要為亮度添加隨機範圍,單擊任意關鍵點並上下拖動包絡線。在那時,燈光將在粉紅色包絡線之間隨機生成亮度。
例如,以下圖表使燈光在第一次閃爍時達到全亮度,第二次閃爍時為50%亮度,然後第三次閃爍為75%亮度。

創建循環持續時間
現在您已擁有一個NumberSequence來確定燈泡的亮度在其壽命內如何變化,您必須確定閃爍循環要花多長時間。換句話說,這個循環持續時間本質上控制NumberSequence以秒為單位的重複頻率。
要創建循環持續時間:
為燈具模型添加新的循環持續時間屬性。
在資源管理器窗口中,選中燈具模型。
在屬性窗口中,導航到屬性部分並單擊添加屬性按鈕。顯示添加屬性對話框。
在 添加屬性 對話框中,
在 名稱 欄位中,輸入 LoopDuration。
單擊 類型 下拉菜單,然後選擇 Number。
單擊 保存 按鈕。新屬性將在屬性窗口的屬性部分中顯示。

將新LoopDuration屬性設置為1。這告訴NumberSequence在一秒後重複。
編寫燈光閃爍的腳本
現在您擁有所有控制燈具壽命內亮度的元素,是時候創建一個Script,使所有內容協同工作並閃爍燈光。
要編寫燈光閃爍的腳本:
- 在資源管理器窗口中,將滑鼠懸停在燈具模型上,然後單擊⊕按鈕。顯示上下文菜單。
- 從菜單中插入一個腳本。
- 在新腳本中,輸入以下內容:
local RunService = game:GetService("RunService")
-- 獲取設置在模型上的屬性值。
local brightnessCurve = script.Parent:GetAttribute("BrightnessCurve")
local loopDuration = script.Parent:GetAttribute("LoopDuration")
-- 儲存將要改變的模型實例的引用。
local light = script.Parent.lamp_hood.SpotLight
local bulb = script.Parent.lightbulb
local beam = script.Parent.lamp_hood.Beam
-- 儲存將要改變的屬性的原始值。
local origLightBrightness = light.Brightness
local origBeamBrightness = beam.Brightness
local origBulbColor = bulb.Color
-- 在特定時間獲取 NumberSequence (ns) 的值
function evaluateNumberSequence(ns: NumberSequence, nsTime: number)
-- 如果我們在0或1,分別返回第一或最後一個關鍵點的值。
if nsTime == 0 then
return ns.Keypoints[1].Value
end
if nsTime == 1 then
return ns.Keypoints[#ns.Keypoints].Value
end
-- 否則,逐個遍歷每對關鍵點。
for i = 1, #ns.Keypoints - 1 do
-- 獲取當前和下一個關鍵點。
local currKp = ns.Keypoints[i]
local nextKp = ns.Keypoints[i + 1]
-- 如果 nsTime 介於關鍵點的時間之間,
if nsTime >= currKp.Time and nsTime < nextKp.Time then
-- 計算 nsTime 介於關鍵點的時間之間的值,稱為 alpha。
local alpha = (nsTime - currKp.Time) / (nextKp.Time - currKp.Time)
-- 返回 nsTime 的值介於兩個點之間,使用 alpha 的值。
return currKp.Value + (nextKp.Value - currKp.Value) * alpha
end
end
end
RunService.Heartbeat:Connect(function()
-- 解決 NumberSequence 的時間 (介於 0 和 1 之間)。
local t = time() / loopDuration
local numberSequenceTime = t - (t // 1)
-- 獲取此時的 NumberSequence 值。
local brightnessValue = evaluateNumberSequence(brightnessCurve, numberSequenceTime)
-- 根據此值調整亮度和顏色屬性。
light.Brightness = origLightBrightness * brightnessValue
beam.Brightness = origBeamBrightness * brightnessValue
bulb.Color = Color3.new(
origBulbColor.r * brightnessValue,
origBulbColor.g * brightnessValue,
origBulbColor.b * brightnessValue
)
end)
當您玩測試您的體驗時,Heartbeat事件連接在每幀執行以下操作:
- 根據當前時間解決brightnessCurve NumberSequence內的時間(numberSequenceTime)。
- 時間介於0到1之間,因為這些分別代表了NumberSequence的起始和結束。
- 在時間numberSequenceTime下解決brightnessCurve NumberSequence的值(brightnessValue)。
- evaluateNumberSequence()計算與任何NumberSequence的時間相關的值。
- 此值作為相對亮度值來應用於隨時間變化的屬性。
- 通過將brightnessValue乘以燈的亮度、光束的亮度和燈泡的顏色來改變燈具的屬性。
這些屬性隨時間的變化使得下面的閃爍效果得以實現。