깜박이는 조명은 환경의 톤에 강력하게 영향을 미치는 요소입니다. 예를 들어, 일정한 밝기의 조명이 있는 집은 따뜻하고 초대하는 느낌을 주지만, 같은 집의 복도에 깜박이는 조명을 추가하면 그것은 오싹하고 앞으로의 위험을 암시할 수 있습니다. 경험 내에서 다양한 조명 소스를 전략적으로 모델링하고 스크립팅함으로써 환경 스토리텔링에 새로운 차원을 추가할 수 있습니다.
모든 3D 제작과 마찬가지로 특정 목표를 달성하는 방법은 여러 가지가 있습니다. 이 가이드에서는 몇 가지 기본 자산을 사용하여 Studio 내에서만 사용할 수 있는 도구와 방법을 통해 깜박이는 조명 애니메이션을 신속하게 생성하는 방법을 설명합니다. 여기에는 사용자 경험의 미적 감각에 맞게 사용자 정의할 수 있는 자식 Class.MeshParts를 포함한 은행가의 램프 모델에 대한 .rbxm 파일이 포함되어 있습니다.
다음의 깜박이는 조명을 만드는 방법에서는 각 섹션을 따라가며 다음을 생성하는 방법을 배울 수 있습니다:
- 조명의 밝기를 시간에 따라 조절할 수 있는 밝기 NumberSequence.
- 각 깜박이는 루프가 소요되는 시간을 결정하는 루프 지속 시간 속성.
샘플 램프 가져오기
이 가이드에서는 깜박이는 조명 기술을 시연하기 위해 다운로드 가능한 고품질의 맞춤형 은행가의 램프 모델 .rbxm 파일을 사용합니다. 이 모델을 사용하여 기본 원리를 이해하고, 이후 Studio 또는 다른 타사 모델링 소프트웨어 내에서 생성한 자신의 모델에 적용할 수 있습니다.
BankersLamp .rbxm을 가져오려면:
Explorer 창에서 Workspace를 마우스 오른쪽 버튼으로 클릭합니다. 상황 메뉴가 표시됩니다.
**Insert From File…**를 선택합니다. 파일 탐색기가 표시됩니다.
BankersLamp .rbxm를 선택한 후 Open 버튼을 클릭합니다. 모델이 뷰포트 내에 표시됩니다.

밝기 NumberSequence 만들기
NumberSequence는 인스턴스의 수명 동안 0에서 1까지의 숫자 값 시퀀스를 나타내는 데이터 유형입니다. 이 데이터 유형은 램프 조명의 밝기가 수명 동안 어떻게 변화할지를 지정할 수 있기 때문에 깜박이는 조명을 만들 때 유용합니다. 밝기를 완전한 강도에서 전혀 빛이 없는 상태로 짧은 간격으로 변경하면 깜박이는 효과를 얻을 수 있습니다.
NumberSequence의 X축은 시간을 나타내고, Y축은 상대 밝기를 나타냅니다. 숫자 시퀀스의 시작과 끝에 있는 각 사각형은 밝기의 수명 동안 속성의 값을 결정하는 키포인트입니다. NumberSequence를 처음 생성하면 그래프는 직선이고 조명의 밝기는 수명 동안 동일하게 유지되지만, 키포인트를 추가하거나 이동시켜 곡선을 만들고 시간이 지남에 따라 램프의 밝기를 변경할 수 있습니다.

램프에는 기본적으로 밝기 NumberSequence가 없지만, 밝기 속성을 생성하고 이를 NumberSequence 유형으로 설정한 다음, 다양한 값으로 키포인트를 추가하여 빛이 설정한 리드미컬하게 깜박이도록 실험할 수 있습니다.
밝기 NumberSequence를 생성하려면:
램프 모델에 새 NumberSequence 속성을 추가합니다.
Explorer 창에서 램프 모델을 선택합니다.
Properties 창에서 Attributes 섹션으로 이동하고 Add Attribute 버튼을 클릭합니다. Add Attribute 대화 상자가 표시됩니다.
Add Attribute 대화 상자에서,
Name 필드에 BrightnessCurve를 입력합니다.
Type 드롭다운 메뉴를 클릭한 다음 NumberSequence를 선택합니다.
Save 버튼을 클릭합니다. 새 속성이 Properties 창의 Attributes 섹션에 표시됩니다.

새 BrightnessCurve 속성을 선택한 다음 … 버튼을 클릭합니다. 숫자 시퀀스 팝업이 표시됩니다.

다음 작업 중 하나를 수행합니다:
- 특정 지점에서 밝기를 변경하려면 키포인트를 클릭하고 위 또는 아래로 드래그하거나 Value 필드에 값을 입력합니다.
- 새 키포인트를 삽입하려면 그래프의 아무 지점을 클릭합니다.
- 키포인트를 삭제하려면 키포인트를 선택한 후 Delete 버튼을 클릭합니다.
- 밝기를 위한 랜덤 범위를 추가하려면 키포인트를 클릭하고 봉투 선을 위쪽 또는 아래쪽으로 드래그합니다. 이 때, 빛은 분홍색 봉투 사이에서 랜덤한 밝기를 생성합니다.
예를 들어, 다음 그래프는 첫 번째 깜박일 때는 전체 밝기, 두 번째 깜박일 때는 50% 밝기, 세 번째 깜박일 때는 75% 밝기를 만듭니다.

루프 지속 시간 만들기
이제 램프 조명의 밝기가 수명 동안 어떻게 변화하는지를 결정할 NumberSequence가 준비되었으므로, 깜박이는 루프가 얼마나 걸릴지를 결정해야 합니다. 다시 말해, 이 루프 지속 시간은 본질적으로 NumberSequence가 반복되는 빈도를 제어하며, 이는 초 단위입니다.
루프 지속 시간을 만들려면:
램프 모델에 새 루프 지속 시간 속성을 추가합니다.
Explorer 창에서 램프 모델을 선택합니다.
Properties 창에서 Attributes 섹션으로 이동하고 Add Attribute 버튼을 클릭합니다. Add Attribute 대화 상자가 표시됩니다.
Add Attribute 대화 상자에서,
Name 필드에 LoopDuration을 입력합니다.
Type 드롭다운 메뉴를 클릭한 다음 Number를 선택합니다.
Save 버튼을 클릭합니다. 새 속성이 Properties 창의 Attributes 섹션에 표시됩니다.

새 LoopDuration 속성을 1로 설정합니다. 이는 NumberSequence가 1초 후에 반복되도록 지시합니다.
빛 깜박임 스크립트 작성하기
이제 램프의 밝기를 수명 동안 조절하는 모든 요소가 마련되었으므로, 모든 요소가 함께 작동하고 조명의 깜박임을 만들어낼 Script를 생성할 시간입니다.
조명의 깜박임을 스크립트로 작성하려면:
- Explorer 창에서 램프 모델 위에 마우스를 올리고 ⊕ 버튼을 클릭합니다. 상황 메뉴가 표시됩니다.
- 메뉴에서 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
-- 특정 시간(nsTime)에서의 NumberSequence(ns)의 값을 가져옵니다.
function evaluateNumberSequence(ns: NumberSequence, nsTime: number)
-- 만약 nsTime이 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를 사용하여 nsTime에 대한 값을 반환합니다.
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 사이입니다.
- numberSequenceTime 시간에서의 brightnessCurve NumberSequence의 값(brightnessValue)을 계산합니다.
- evaluateNumberSequence()는 어떤 NumberSequence에 대해 특정 시간과 관련된 값을 계산합니다.
- 이 값은 시간이 지남에 따라 변경되는 속성에 적용될 상대적인 밝기 값으로 사용됩니다.
- 램프의 속성을 변경하여 빛의 밝기, 빔의 밝기, 전구의 색상에 brightnessValue를 곱합니다.
이러한 속성의 변동은 아래와 같은 깜박이는 효과를 생성합니다.