こんにちは、ロブスタのハルです!
前回の講座では制御構文の一つであるfor文について解説しました。
今回はfor文に慣れるために演習として電灯のプログラムを実装します。
前回の講座を見ていない方はこちらからご覧ください。
電灯の実装
ライトや電灯があるとゲームをより充実したものにすることができますね。ここではfor文の練習のために壊れかけの電灯を作ってみたいと思います。これを応用すればホラーゲームの電灯を再現することもできますよ。
概要
今回作りたいプログラムは以下のようなものです。
- 時間が経過すると明るさが変わる
明るさを徐々に増やしたり減らすということなのでwhile文もしくはfor文が使えそうですね。
実装
アイテムの作成
まずは電灯のオブジェクトを作っていきましょう。
最初にゲームの世界を夜にしておきましょう。エクスプローラ上でLightingを選んで、ClockTimeプロパティを0にしてください。
上の画像のように夜空が出てきたらOKです!
次にパーツを追加し、Lampという名前に変更します。
それからLampの子としてPointLightを追加します。
そしたらPointLightのBrightnessプロパティのバーを左右に動かしてみてください。動かすにつれてLampパーツがどう変化するのかぜひ自分で確かめてみてくださいね。
最後にLampの子に新しいスクリプトを追加しFlashScriptという名前にします。
プログラムを書く
流れを考える
今回は時間の経過とともに明るさが変化する電灯を作りたいんでしたね。ここまでの知識でプログラムを書くことができるので少し考えてみてください。
…
…
…
思いつきましたか?
僕は次のようにしようと思います。
明るさはPointLightのBrightnessプロパティをいじることで変わることを確認しました。ということは時間を1増やすとBrightnessプロパティの値を1変化させるようなプログラムを作ればいいと思いつきますね。
つまり、以下のようにすればいいと思います。
- Lampオブジェクトを変数に代入しておく
- PointLightオブジェクトを変数に代入しておく
- 明るさの変化量と明るさの変化速度をともに1に設定しておく
- forループで明るくするループを実装する
コーディング
さて、コーディングしてみましょう。
local lamp = script.Parent
local pointLight = lamp.PointLight
local changeBrightness = 1
local speed = 1
-- だんだん明るくする処理
for brightness = 0, 10, changeBrightness do
pointLight.Brightness = brightness
task.wait(speed)
end
1~4行目で変数を設定しています。1・2行目ではlampとpointLightオブジェクトを設定しており、3・4行目では一度にどのくらい明るくするのか(changeBrightness)と変化速度(speed)を設定しています。
7~10行目では段々と明るくする処理としてfor文を使っています。まず、for文のカウント変数としてbrightnessを設定します。これはpointLightの明るさです。初期値は0、終了値は10としています。増分にchangeBrightnessを使うことで明るさを一度にchangeBrightnessの値だけ増やします。for文の中の処理ではpointLight.Brightnessにbrightnessを代入することで明るさを変えています。その後、task.wait(speed)によってspeedの値だけ待っています。
brightnessは0, 1秒待つ, 1, 1秒待つ, 2, 1秒待つ, …, 9, 1秒待つ, 10, 1秒待つという動作をしています。
テスト
一度実行してみましょう。おそらく徐々にLampオブジェクトが明るくなっているはずです。
さて、このままだと明るくなって終わりなので今度は暗くしたいですね。そこで以下のようなコードを追加してみましょう。
-- だんだん暗くする処理
for brightness = 10, 0, -changeBrightness do
pointLight.Brightness = brightness
task.wait(speed)
end
変更点として初期値が10、終了値が0となっています。また、増分が-changeBrightnessとなっていますがこれはマイナスの値を足していくことを意味します(10から0に減らす)。つまり、brightnessは10, 1秒待つ, 9, 1秒待つ, 8, 1秒待つ, …, 1, 1秒待つ, 0, 1秒待つという動作をしています。
local lamp = script.Parent
local pointLight = lamp.PointLight
local changeBrightness = 1
local speed = 1
-- だんだん明るくする処理
for brightness = 0, 10, changeBrightness do
pointLight.Brightness = brightness
task.wait(speed)
end
-- だんだん暗くする処理
for brightness = 10, 0, -changeBrightness do
pointLight.Brightness = brightness
task.wait(speed)
end
上記のようにすると明るくなって暗くなるといった動作をするはずです。ただ、明るくなって暗くなるのは1回だけです。これを何度も繰り返すようにしたいですよね。そこで使うのが無限ループです。
local lamp = script.Parent
local pointLight = lamp.PointLight
local changeBrightness = 1
local speed = 1
while true do
-- だんだん明るくする処理
for currentBrightness = 0, 10, changeBrightness do
pointLight.Brightness = currentBrightness
task.wait(speed)
end
-- だんだん暗くする処理
for currentBrightness = 10, 0, -changeBrightness do
pointLight.Brightness = currentBrightness
task.wait(speed)
end
end
第15回で説明したようにwhile文の継続条件式をtrueに設定すると無限ループとなります。
これを実行するとLampが明るくなって暗くなる動作をするようになったと思います。このLampを他のパーツにくっつけることで電灯を作ることができます!
まとめ
- for文の増分はプロパティの数値に使うことができる
- LightingのClockTimeプロパティでワールドの時間帯(朝・昼・夜)を変更できる
- PointLightのBrightnessプロパティで明るさを変更できる
お疲れ様でした。今回は明るさを時間に応じて変化させるプログラムを作りましたが、同じ考え方を使えば他の何かを変化させることもできそうですね。例えば、時間に応じて朝・昼・夜(1日のサイクル)を変化させることもできそうです。つまり、for文やwhile文を使うことでオブジェクトに動きをつけることができると考えてしまっても大丈夫です。
少し短くなってしまいましたが、次回はテーブルについて解説します。
コメント