初心者向け!スクリプトの基礎をマスターしよう【Roblox Studio】

9. プロパティを徐々に変更 (forフォー文)

かえ処理しょりというものを使い、だんだん透明になっていくパーツを作ってみます。

繰り返し処理には大きく分けてふたつの種類があります。
回数が決められた繰り返しと、特定の条件で永久に続く繰り返しです。

まずは回数が決められた繰り返しを使ってみましょう。これはforフォーを使用して実現できます。

for 変数 = 初めの値, ゴールの値, 足されていく値 do
	-- この中に繰り返されるプログラムを書く
end

ためしに1から10までの数を出力するスクリプトを書いてみましょう。

まめすけ
まめすけ

これをこうして…こうかな?

for A = 1, 10, 1 do
	task.wait(1)
	print(A)
end

定義している変数Aを見ると分かる通り、for文の中で定義する変数には、localを書く必要がありません。
この変数はfor文の中でしか使えないので注意してください。

繰り返し処理はとても高速に動くので、print関数の前にtask.wait関数を入れ、1秒待ってから出力されるようにしています。

プログラム内部では、以下の順序で動いています。

for文の開始

変数を定義&値が代入される

繰り返し処理の実行

for文の中に書かれたプログラムが上から順に実行される

繰り返し処理が終わると…

足されていく値変数足して、ゴールの値より変数のほうが小さければ、STEP.2にもどる
最終的にゴールの値よりも変数のほうが大きくなったら繰り返しが終わる

練習

では実際に、だんだん透明になるパーツを作ってみましょう。

一度ご自身で書いてみて、どうしても分からない場合は以下のスクリプトをご確認ください。

こたえ
local part = workspace.Folder.Part

for count = 0, 1, 0.1 do
	task.wait(1)
	part.Transparency = count
end

-- 完全に透明になってから、当たり判定をオフにすることもできる
part.CanCollide = false

別の例として、パーツの位置を徐々に移動させるスクリプトもご紹介します。

パーツの位置を徐々に移動
local part = workspace.Folder.Part

for nextY = 0, 10, 1 do

	task.wait(1) -- 1秒待つ
	
	-- 位置のデータ型で指定する
	-- XとZ軸の位置は0のまま、Y軸の位置だけ徐々に変化させる
	local newPosition = Vector3.new(0, nextY, 0)
	
	-- パーツのPositionプロパティに代入する
	part.Position = newPosition

end

このスクリプトでは、パーツのY軸 (上下) の位置を徐々に上に移動しています。

プロパティ別データ型の例で紹介した、オブジェクトの位置のデータ型であるVector3を使用しています。

X軸やZ軸が移動するようにしたり、移動しながら大きさを変えたり出来るので、8. プロパティを数秒後に変更を参考に色々なパーツのプロパティを徐々に変更してみてください。

10. プロパティを規則的に変更 (whileホワイル文)

回数が決められた繰り返し処理ができるfor文を使い、プロパティを徐々に変更することができました。

ですが、for文では繰り返しが終わるとそこでプロパティの変更が終わってしまいます。
特定の条件で永久に続く繰り返しを使い、ずっとプロパティが変わっていくスクリプトを作ってみましょう。

特定の条件で永久に続く繰り返しは、whileホワイルを使用することで実現できます。

while ここにtrueかfalseを入れる do
	-- この中に繰り返されるプログラムを書く
end

whiledoの間にtrueを入れると無限に繰り返され、反対にfalseを入れるとこのプログラムは実行されません

もしfalseを入れたら何の意味もないプログラムになりますが、次の章で解説する条件文じょうけんぶんと呼ばれるものを使えば、もっと複雑な繰り返し処理ができるようになります。

以下のスクリプトで、無限にこーんにーちはーと出力されます。

while true do
	print("こーんにーちはー")
	task.wait()
end
while文を使うときの注意点

ひとつ、while文をつかう際に絶対に守らなくてはならないことがあります。

以上のスクリプトのように、while文の中には必ずtask.wait関数を入れてください。
繰り返し処理はとても高速に動く上、while文場合によって無限に実行されるので、パソコンが延々と高速に繰り返しをする羽目になりクラッシュしてしまうからです。
秒数を指定しないで1フレーム待つだけでもいいので、必ず入れておきましょう。

練習

while文の使い方がわかったので、少し難しいですがためしにパーツが徐々に透明になり、徐々に不透明になるのを繰り返すスクリプトを作ってみましょう。

一度ご自身で書いてみて、どうしても分からない場合は以下のスクリプトをご確認ください。

こたえ
まめすけ
まめすけ

スクリプトが長いよ~ 😭

無限に繰り返すwhile文の中に、for文を使って徐々に透明にするプログラムと、反対の徐々に不透明にするプログラムが上から順番に実行されます。

実際にスクリプトを使ってみて、いろいろ値をいじって確認してみてください。

local part = workspace.Folder.Part

while true do

	-- 2秒待った後、徐々に透明にする
	task.wait(2)

	for count = 0, 1, 0.1 do
		part.Transparency = count
		task.wait(0.1)
	end

	-- 当たり判定をオフにする
	part.CanCollide = false

	task.wait(2) -- 2秒待つ

	-- 見えるようになる前に当たり判定をオンにする
	part.CanCollide = true

	for count = 0, 1, 0.1 do
		-- 値を減らすことで不透明にするため、引き算をする
		part.Transparency = 1 - count
		task.wait(0.1)
	end

end

11. プロパティを確認 (ifイフ文)

スクリプトでは、条件文じょうけんぶんと呼ばれるものを使って、さまざまな比較ひかくをすることができます。

条件文はとてもシンプルなので、ためしに書いてみましょう。

local test = 10 > 5
print(test)

-- 変数にいれなくてもOK
print(10 > 5)

このスクリプトでは、105よりも大きい数かどうか比較をして、その結果を出力しています。
条件文の結果はtruefalseの二通りで、条件文あっていたらtrue間違っていたらfalseです。

>のように値を比較できる記号のことを、比較演算子ひかくえんざんしと呼びます。
ほかにもさまざまな種類があるので、ためしてみてください。

比較演算子説明スクリプト例
(すべてtrueになる)
>左の数値が右の数値よりも大きいprint( 10 > 5 )
<左の数値が右の数値よりも小さいprint( 27 < 30 )
>=左の数値が右の数値以上print( 7 >= 4 )
<=左の数値が右の数値以下print( 3 <= 6 )
==右と左の値が同じprint( ”やあ” == “やあ” )
~=右と左の値が違うprint( “え?” ~= “うん” )
シャインマスカットちゃん
シャインマスカットちゃん

どれがどれだかわからなくなったら、いつでもこのリンクから確認すればいいんじゃね?知らんけど。

では、ためしに条件文を使ってプロパティの確認をしてみましょう。

ifイフを使えば、trueだったらこのプログラムを実行し、falseだったらこれを実行するといった条件分岐じょうけんぶんきができるようになります。

使い方はとてもシンプルで、以下のようにifthenの間にある値がtrueだったら中のプログラムが実行されます。

if 10 > 5 then
	print("10は5よりも大きいよ")
end

これを使って、パーツのプロパティを確認してみましょう。

以下のスクリプトでは、パーツの透明度を確認しています。

local part = workspace.Folder.Part

if part.Transparency == 1 then
	print("パーツは透明です")
end

また、if文は以下のようにfalseだった場合のプログラムも書くことができます

if 値 then
	trueだった場合のプログラム
else
	falseだった場合のプログラム
end

これを使えば、パーツが透明か透明でないかの2通りで確認できるようにすることもできます。

local part = workspace.Folder.Part

if part.Transparency == 1 then
	print("パーツは透明です")
else
	print("パーツは透明ではありません")
end

比較演算子は、先ほど学んだwhile文にも使用できます。

以下の例では、パーツのY軸の位置をゆっくり上に移動させています。 高さが100を超えたらwhile文の値がfalseになるので、繰り返し処理が終了します。

local part = workspace.Folder.Part

print("パーツをゆっくり上に移動します!")

-- 繰り返すたびに、whileとdoの間がtrueになるか確認される
while part.Position.Y < 100 do
	-- 現在の位置に対して、少しだけy軸を足す
	local nextPosition = part.Position + Vector3.new(0, 0.01, 0)
	part.Position = nextPosition -- パーツの位置プロパティに代入する
	task.wait() -- 1フレーム待つ
end

-- 繰り返し処理が終了したことを出力する
print("パーツのY軸の位置が100を超えました!")

12. 関数のもど

すべての関数には、もどと呼ばれるものがあります。
戻り値とは、関数の処理が終わった後、関数が渡してくれる結果の値のことです。

task.wait関数の場合は、処理である 指定された時間待つ が終わると、実際に待った時間が戻り値として返されます。

以下のスクリプトだと、まずtask.wait関数が1秒待った後、実際に待った正確な時間が変数aaaに代入され、print関数で出力されます。

プログラムは正確に1秒待つことは不可能なので、多少の誤差は出ますが、だいたい数値の1が出力されるはずです。

local aaa = task.wait(1)

print(aaa)

もう少しわかりやすくするために、実際にプログラムが動く順序を書いておきます。

関数が実行される

今回の例では、task.wait関数が1秒待つ

関数が戻り値におきかわる

task.wait関数が1秒待ったら、task.wait(1)と書いたところが戻り値に置きかわる。

おきかわった戻り値で、スクリプトの実行がつづく

このとき、プログラムは以下のように解釈されます。

local aaa = 1

print(aaa)

これにより、変数aaaには数値の1が代入され、print関数で変数aaaの中身が出力されます。

変数と同様に、関数の部分が戻り値におきかわるので、以下のような書き方もできます。

-- 3秒待った後、実際に待った時間を出力する
print( task.wait(3) )

-- 1秒待った後、実際に待った時間に1を足して出力する
print( task.wait(1) + 1 )

print関数など、一見戻り値を返す必要がないような関数も戻り値を返しますが、nilなので使用する場面はありません。

local yay = print("あ、どうも")

print(yay)

13. ランダムに当たり判定を変更 (mathマス.randomランダム関数)

関数の戻り値について知ることができたので、さっそくランダムに当たり判定を変更するスクリプトを書いてみましょう。

Robloxには、ランダムな数値が戻り値として返ってくるmathマス.randomランダム関数があります。
このように、()の中でランダムな数値の範囲を指定できるようになっています。

local ABAB = math.random(最小の値, 最大の値)

このスクリプトでは、1から10までの範囲でランダムな数値戻り値として変数に代入され、出力されます。

local hey = math.random(1, 10)

print(hey)

練習

この関数を使って、ためしに数秒ごとにランダムにパーツの当たり判定が変わるスクリプトを書いてみましょう。

一度ご自身で書いてみて、どうしても分からない場合は以下のスクリプトをご確認ください。

こたえ

while文を使って2秒ごとに処理を繰り返すようにします。
01のランダムな数値を決めて、それが1だったら当たり判定をオンにして不透明にし、0だったら当たり判定をオフにして透明にしています。

このスクリプトでは確率は2分の1ですが、少しスクリプトを変えれば透明になる確率を調整できるので、ためしてみてください。

local part = workspace.Folder.Part

while true do

	task.wait(2)

	if math.random(0, 1) == 1 then
		part.CanCollide = true
		part.Transparency = 0
	else
		part.CanCollide = false
		part.Transparency = 1
	end
	
end
1 2 3 4