【Lua言語講座】17.演習-for文-

Lua言語講座

こんにちは、ロブスタのハルです!
前回の講座では制御構文の一つであるfor文について解説しました。
今回はfor文に慣れるために演習として電灯のプログラムを実装します。
前回の講座を見ていない方はこちらからご覧ください。

電灯の実装

ライトや電灯があるとゲームをより充実じゅうじつしたものにすることができますね。ここではfor文の練習のためにこわれかけの電灯を作ってみたいと思います。これを応用すればホラーゲームの電灯を再現することもできますよ。

概要

今回作りたいプログラムは以下のようなものです。

  • 時間が経過けいかすると明るさが変わる

明るさを徐々じょじょに増やしたり減らすということなのでwhileワイル文もしくはforフォー文が使えそうですね。

実装

アイテムの作成

まずは電灯のオブジェクトを作っていきましょう。

最初にゲームの世界を夜にしておきましょう。エクスプローラ上でLightingライティングえらんで、ClockTimeクロックタイムプロパティを0にしてください。

上の画像のように夜空が出てきたらOKです!

次にパーツを追加し、Lampランプという名前に変更します。

それからLampの子としてPointLightポイントライトを追加します。

そしたらPointLightのBrightnessブライトネスプロパティのバーを左右に動かしてみてください。動かすにつれてLampパーツがどう変化するのかぜひ自分で確かめてみてくださいね。

最後にLampの子に新しいスクリプトを追加しFlashScriptフラッシュスクリプトという名前にします。

プログラムを書く

流れを考える

今回は時間の経過とともに明るさが変化する電灯を作りたいんでしたね。ここまでの知識ちしきでプログラムを書くことができるので少し考えてみてください。

思いつきましたか?
僕は次のようにしようと思います。

明るさはPointLightのBrightnessプロパティをいじることで変わることを確認しました。ということは時間を1やすとBrightnessプロパティのあたいを1変化させるようなプログラムを作ればいいと思いつきますね。

つまり、以下のようにすればいいと思います。

  1. Lampオブジェクトを変数に代入しておく
  2. PointLightオブジェクトを変数に代入しておく
  3. 明るさの変化量と明るさの変化速度をともに1に設定しておく
  4. 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行目では一度にどのくらい明るくするのか(changeチェンジBrightness)と変化速度(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文を使うことでオブジェクトに動きをつけることができると考えてしまっても大丈夫です。

少し短くなってしまいましたが、次回はテーブルについて解説します。

コメント

タイトルとURLをコピーしました