闪烁的灯光 是一种强大的力量,可以影响环境的音调。例如,一个有照明的一致亮度的家庭可以感觉温暖,但如果你在同一家主页的走廊添加闪烁的灯光,它就会变得恐怖,可能暗示前进的危险。通过策略模型和脚本不同的灯光源在您的体验中,您
与所有 3D 作品一样,实现任何特定目标的许多方法都很多。在本指南中,您可以使用仅在 Studio 中提供的工具和方法快速创建闪烁的灯光动画,包括仅包含子 .rbxm 的文件以便满足您自己的体验的美学。
在下面的方法中,创建闪烁的灯,请跟随每个部分学习如何创创建 or 创作:
- 一个亮度 NumberSequence 来影响灯的亮度随着时间的推移。
- 循环时间属性,用于确定每个闪烁循环的时间长度。
导入样例灯
本指南使用高质量、可定制的 .rbxm 文件来展示闪烁灯技术。您可以使用此模型来理解基本原理,然后将它们应用到您创建 Studio 或其他第三方建模软件中的模型。
要导入 BankersLamp.rbxm:
在 Explorer 窗口中,右击 工作区 。 一個上下文菜单显示。
选择 从文件中插入… 一个文件浏览器显示。
选择 银行家灯 ,然后单击.rbxm按钮。模型将在视图中显示。
创建一个亮度数序
A NumberSequence 是一个数据类型,代表一个实例的整个寿命中从 0 到 1 的一系列数字值。 此类型的数据类型有助于创建闪烁的灯光,因为您可以指定灯光的亮度在其整个寿命中变更,并且在不间断的短时间内从全强度到无灯的状态,您可以实现闪烁
Datatype.NumberSequencer 的 X 轴表示时间,Y 轴表示相对亮度。 每个正方形在开始和结束数字序列的两端是一个 键 ,它将 property 在该亮度的时间为准确的确定。 当您首次创建一个 <
虽然灯没有默认的亮度 NumberSequence ,但您可以通过创建一个亮度属性将其设置为 NumberSequence 输入型,然后通过添加不同的键点直到灯在您设置的频率闪烁。
要创建一个亮度 NumberSequence :
为灯具模型添加一个新的数字序列属性。
在 Explorer 窗口中,选择灯具模型。
在 属性 窗口中,导航到 属性 部分,然后单击 添加属性 按钮。显示 2>添加属性2> 对话框。
在 添加属性 对话框中,
在 名称 字段中,输入 BrightnessCurve 。
单击 类型 拖动菜单,然后选择 数字序列 。
点击 保存 按钮。新属性显示在 属性 部分的 属性 窗口的1>保存1>部分。
选择新的 曲线亮度 属性,然后单击 … 按钮。一个数字序列弹出显示。
执行以下任意操作:
- 要改变点上的亮度,单击一个键点,或将其拖动上或向下,或在 值 字段中输入值。
- 要插入新的钥匙点,请单击图形中的任意位置。
- 要删除键点,请选择键点,然后单击 删除 按钮。
- 要为亮度添加一个随机范围,请单击任意键点并将环绕线向上或向下拖动。在那时,灯光将在粉色封面之间的随机亮度之间生成。
例如,下图使灯闪烁到最高亮度,第一闪烁的亮度为 50%,第二闪烁的亮度为 25%,然后第三闪烁的亮度为 75%。
创建循环时间
现在您有一个 NumberSequence 来确定灯光的亮度在其生命时间变化的方式,您必须确定要使用的闪烁循环时间。在其他 words, 此循环时间基本上控制灯光的重复次数,在秒内。
要创建循环时间:
为灯具模型添加新的循环时间属性。
在 Explorer 窗口中,选择灯具模型。
在 属性 窗口中,导航到 属性 部分,然后单击 添加属性 按钮。显示 2>添加属性2> 对话框。
在 添加属性 对话框中,
在 名称 字段中,输入 LoopDuration 。
单击 键入 菜单,然后选择 数量 。
点击 保存 按钮。新属性显示在 属性 部分的 属性 窗口的1>保存1>部分。
将新的 LoopDuration 属性设置为 1 。这使得 NumberSequence 在 1 秒后重复。
编写灯闪烁
现在您已经有了控制灯的亮度的所有元素,现在是时候创建一个 Script 来让一切都能顺顺利利地运行,并且闪烁灯光。
要将灯光闪烁脚本:
- 在 Explorer 窗口中,将鼠标悬停在灯具模型上,单击 ⊕ 按钮。一个上下文菜单显示。
- 从菜单中,插入一个 脚本 。
- 在新脚本中,输入以关注中/正在关注内容:
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
-- 在特定时间(nsTime)获得数字序列的值
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)
-- 使用 alpha 返回时间之间的值。
return currKp.Value + (nextKp.Value - currKp.Value) * alpha
end
end
end
RunService.Heartbeat:Connect(function()
-- 解决 数列列时间 (在 0 和 1 之间) 的问题。
local t = time() / loopDuration
local numberSequenceTime = t - math.floor(t)
-- 获取此时数字序列的值。
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)
当您测试您的体验时,心跳函数每个框架都会执行以下内容:
- 解决一个时间 ( numberSequenceTime ) 在 brightnessCurve NumberSequence 基于当前时间。
- 时间在 0 和 1 之间,这分别代表数字序列的开始和结束。
- 解决为值 ( brightnessValue ) 的 brightnessCurve NumberSequence 在时间 1> numberSequencerTime1> 。
- evaluateNumberSequence() 计算任何 NumberSequence 的时间与价值。
- 这个值作为相对亮度值,可应用于更改随着时间的推移而发生的属性。
- 通过将 brightnessValue 乘以灯的亮度、光束的亮度和灯泡的颜色来改变灯的属性。
随着这些属性的更改,时间过长会导致下面闪烁的效果。