フリッカーライトは、環境のトーンに影響を与える強力な力です。例えば、一貫した明るさの照明がある家は温かくて魅力的に感じますが、同じ家の廊下にフリッカーする光を加えると、それは不気味になり、前方に潜在的な危険があることを示唆するかもしれません。あなたの体験内でさまざまな光源を戦略的にモデリングし、スクリプト化することで、環境ストーリーテリングに新たなレベルを追加できます。
すべての3D作成と同様に、特定の目標を達成するための方法はいくつかあります。このガイドでは、スタジオ内でのみ利用可能なツールと方法を使用して、基本的なアセットをいくつか使い、フリッカーライトアニメーションを迅速に作成できます。これには、子のClass.MeshPartsが含まれる銀行のランプモデルの.rbxmファイルが含まれており、あなた自身の体験の美的様式に合わせてカスタマイズできます。
以下のフリッカーライトを作成する方法に従い、各セクションを学んでください:
- ランプの明るさを時間とともに変化させるための明るさNumberSequenceを作成します。
- 各フリッカーループの所要時間を決定するループ期間属性を作成します。
サンプルランプのインポート
このガイドでは、フリッカーライト技術を示すために、ダウンロード可能な高品質でカスタマイズ可能な銀行のランプモデルの.rbxmファイルを使用します。このモデルを使用して基本的な原則を理解し、次にスタジオ内または他のサードパーティモデリングソフトウェアで作成する自身のモデルに適用できます。
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ボタンを押します。
- 明るさのランダム範囲を追加するには、任意のキーポイントをクリックし、エンベロープラインを上下にドラッグします。その時、光はピンクのエンベロープの間でランダムな明るさで生成されます。
例えば、次のグラフは、最初のフリッカーで光の明るさをフルにし、2回目のフリッカーで50%の明るさ、3回目のフリッカーで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
-- 特定の時間における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がキーポイントの時間の間でどこに位置するかを計算します。これをアルファと呼びます。
local alpha = (nsTime - currKp.Time) / (nextKp.Time - currKp.Time)
-- 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の間であり、これがNumberSequenceの開始と終了をそれぞれ表します。
- 時間numberSequenceTimeにおけるbrightnessCurve NumberSequenceの値(brightnessValue)を解決します。
- evaluateNumberSequence()は、任意のNumberSequenceに対する時間に関連する値を計算します。
- この値は、時間とともに変化するプロパティに適用する相対的な明るさの値となります。
- ランプのプロパティを、光の明るさ、ビームの明るさ、電球の色をbrightnessValueで掛け合わせて変更します。
これらのプロパティを時間とともに変更することで、以下のフリッカー効果が生じます。