forループの練習として、時間が経過すると明るくなったり暗くなったりするランプを作成します。
パーツとスクリプトを設定する
ランプはライトとスクリプトを持つパーツとします。
- ライトを見やすくするために、ゲームワールドの時間を夜に変更します。Explorer(エクスプローラー) > Lighting(照明) > で ClockTime を 0 に変更します。(午前0時)
- Lamp という名前の新しいパーツを作成します。
- Lamp を選択し、PointLight を追加します。PointLight の brightness(明るさ)を調整することにより、光るランプを作成します。
- Lamp に GlowScript という名前の新しいスクリプトを追加します。
- GlowScript で、ランプのパーツと PointLight を格納する変数を作成します。
-- LampとPointLightにアクセスしやすいようにする
local lightPart = script.Parent
local light = lightPart.PointLight
- 次に、ループが実行されるたびに変化させる光の量を示す変数と、ループが次に実行されるまでに何秒間待つのかを示す変数を作成します。
-- ライトの明るさが毎回どれくらい変化するのか
local brightnessChange = 1
-- ライトが明るさを変える頻度
local timeChange = 1
数字のかわりに変数を使用する
明るさを示す変数を作成することで、後から値を調整することが容易になります。このようにすることで、長いコードを上から下まですべて見なくても、スクリプトの最初の方に集まっている変数を見るだけでよくなります。後からの変更も容易に行えるというわけです。
ランプを光らせる
ランプは、2つのforループを使用します。ひとつはカウントアップによりランプを明るくするもの、もうひとつはカウントダウンによりランプを暗くするものです。各ループには、currentBrightness と呼ばれる制御変数が含まれます。これにより、ループの制御変数が上下すると、ライトの明るさも上下するようになります。
最初のforループを作成する
forループは、キーワードforで始まり、その後に制御変数が続きます。このスクリプトでは、ライトのbrightness値を制御変数に設定します。
- 次の値を使用してforループをコーディングします。制御変数と終了値はカンマで区切ることを忘れないでください。
- 制御変数:currentBrightness
- 開始値:0
- 終了値:5
-- ライトの明るさが毎回どれくらい変化するのか
local brightnessChange = 1
-- ライトが明るさを変える頻度
local timeChange = 1
for currentBrightness = 0, 5
明るさの値
0はライトがオフ、5はライトがオンとなることを意味します。他の値を使用したい場合、PointLightの値は0から40の範囲で指定します。
- 増加値については、先ほどの brightnessChange 変数を使用します。合計が終了値に到達するまでループが実行され、currentBrightness に brightnessChange の値が加算されます。
- do を入力し、[Enter]を押せば、forループ終了の end がオートコンプリートで現れます。
for currentBrightness = 0, 5, brightnessChange do
end
forループは数字と変数が使用できる
先ほど作成した変数をforループの開始値、終了値、増加値の代わりに使用することができます。
- ライトの明るさを設定するには、Brightnessプロパティに値を代入すればよいので、「light.Brightness = brightnessChange」と入力します。これにより、ループが実行されるたびにライトの明るさが増します。
for currentBrightness = 0, 5, brightnessChange do
light.Brightness = currentBrightness
end
- 明るさの変化がいっきに起こらないようにするには wait 関数を使用します。待ち時間は timeChange の値にします。
for currentBrightness = 0, 5, brightnessChange do
light.Brightness = currentBrightness
wait(timeChange)
end
- テストプレイして、光の明るさが1秒ごとに増加するのを確認してください。
問題解決のヒント
明るさの変化が確認できない場合、
・light.Brightness = currentBrightness が do と for ループの end の間にあることを確認してください。
timeChangeが少なくとも1以上であることを確認してください。数値が小さいと、明るさの変化は速くなりますが、変わっていく様子が分かり難くなります。
・forループの最初の行で、制御変数、終了値、増加値を合計2つのカンマで区切っていることを確認します。
ライトをオフにする
ライトをオンにすることができたので、次にライトをオフにするループを作ります。ライトが明るい状態から徐々に暗くなるように、このループの値は逆になります。
- 次の値を使用してforループをコーディングします。
- 制御変数:5 (currentBrightness を以前のループの終了値である5に設定)
- 終了値:0 (ライトはオフ)
- 増加値: -brightnessChange (変数名の前に「-」を付けると、そのままマイナス値になる)
-- オンとオフを繰り返すループ
while true do
for currentBrightness = 0, 5, brightnessChange do
light.Brightness = currentBrightness
wait(timeChange)
end
for currentBrightness = 5, 0, -brightnessChange do
light.Brightness = currentBrightness
wait(timeChange)
end
end
- テストプレイし、ライトが明るくなったり暗くなったりすることを確認してください。
問題解決のヒント
時間が経っても明るさが変わらない場合、
・light.Brightness = currentBrightness が forループの do と end の間にあることを確認します。
・timeChange が1以上大きくなっていることを確認します。これより小さい数字だと、明るさはより速く変化しますが、変わっていることが分かりにくくなります。
・forループの最初の行で合計2個のカンマがあり、それぞれ制御変数、終了値、増加値を区切っていることを確認します。
ライトが作成できたので、GlowScript と PointLight の両方をコピーして、他のワールド内にランプを追加することができます。