配列を while や for などのループと組み合わせることにより、配列内の各プレイヤーをテレポートさせたり、配列内にパーツを入れて置き、順番に発火させることもできます。
例として、数秒ごとにパーツが消えていくというものを作成してみます。
プロジェクトの設定
プロジェクトには、連続したパーツが必要です。これらのパーツを数秒間隔で連続して透明にしていきます。
パーツとスクリプト
テンプレートは、Classic Baseplate や Baseplate、または Obby 等を使用して開始します。
- パーツとスクリプトを保存するために、DisappearingPath というフォルダを作成します。そのフォルダの中に、さらに Parts という名前のフォルダと PathScript という名前のスクリプトを追加します。
- 下記のように、少なくとも 3 つのパーツで構成される橋を作ります。パーツの名称を変更します。Part1 を最初に、Part3 を最後にしてください。名前を間違えるとスクリプトエラーになってしまいますので注意しましょう。
- PathScript で、DisappearingPath フォルダと Parts フォルダを格納する変数を作成します。
local path = script.Parent
local partsFolder = path.Parts
パーツの配列
配列の内容をすべて 1 行で記述することもできますが、数が多くなりと見づらくなりますので、1つ1つ改行して別の行に入力します。
- パーツの配列を保存するには、「local pathArray = {」と入力し、 Enter キーを押すと自動的に「}」が入ると思います。入らなかった場合は下記のように手動で入力してください。
local path = script.Parent
local partsFolder = path.Parts
local pathArray = {
}
- 配列の{ }の間に、Parts フォルダ内に含まれる各パーツをカンマで区切って入力します。最後の値にはカンマは不要ですがあっても構いません。これらのパーツを配列に格納しているため、個別に「local part1 = 」とする必要もありません。
local path = script.Parent
local partsFolder = path.Parts
local pathArray = {
partsFolder.Part1,
partsFolder.Part2,
partsFolder.Part3
}
配列のループ
「pathArray[1].Transparency = 1」などと、各インデックスを使用してパーツを非表示にすることもできますが、ループを使用することによりコードが少なくて済み、後でパーツを追加しても配列に追加するだけになりますのでとても便利です。
for ループのコーディング
for ループを使用して、配列の順番に個々のパーツを透明にします。
- 数秒ごとにパーツを透明にしたいと思いますが、この秒数を destroyRate という変数に入れておきます。パーツの数を多くした場合、テストではこの値を小さく設定することをお勧めします。
local pathArray = {
partsFolder.Part1,
partsFolder.Part2,
partsFolder.Part3
}
local disappearRate = 1
- 次の for ループを作成します。
- 開始値:partIndex = 1 (配列内の最初のインデックス値)
- 終了値:#pathArray (配列のサイズ)
local disappearRate = 1
for partIndex = 1, #pathArray do
end
- wait() を入れないと、一瞬で全パーツが透明になってしまいます。ループ内に「wait(disappearRate)」 とし、一度に透明にならないようにします。
for partIndex = 1, #pathArray do
wait(disappearRate)
end
- whichPart という変数を作成し、そこに配列の要素を代入します。whichPart には Part オブジェクトが入りますので、関係するプロパティに代入それば完了です。CanCollideプロパティを false に設定すると通り抜けられるようになります。Transparency を 1 に設定すると完全な透明になります。
for partIndex = 1, #pathArray do
wait(disappearRate)
local whichPart = pathArray[partIndex]
whichPart.CanCollide = false
whichPart.Transparency = 1
end
- 橋の一部が時間の経過とともに消えることを確認します。
トラブルシューティング
この時点で橋が消えないか、全く橋が見えない場合は、次の項目を確認してください。
パーツがすぐに消えてしまうか、最初にすべてなくなってしまう
- disappearRatが 1 より大きいことを確認してください。
- ゲームを実行した後に、キャラクターが作られるまでに時間がかかります。よって最初の橋がすでに消えてしまっている場合があります。これに対処するには、for 文の前に「wait(5)」などと入力し、橋が消えるまでに少し待つといいでしょう。
スクリプトにエラーが発生し停止してしまう
- 配列内の各パーツの名前が間違っていませんか? エクスプローラを確認してください。まれに全角になっている場合があります。
- 最後の値を除いて、各要素がカンマで区切られていることを確認してください。
- #pathArray の # やpathArray[partIndex]の[ ]などの特殊記号の間にスペースがないことを確認します。
2 番目のループのコーディング
現在、橋は永遠に消えます。それらを再表示するには、もう1つ for ループを作成し、全パーツをリセットして橋を歩けるようにしなくてはなりません。
- 最初の for ループの後に wait() を追加して、橋が再表示されるまでの待機時間を設けます。
for partIndex = 1, #pathArray do
wait(disappearRate)
local whichPart = pathArray[partIndex]
whichPart.CanCollide = false
whichPart.Transparency = 1
end
wait(1)
- 橋の各パーツの CanCollide プロパティを true に、Transparency を 0 に変更して、橋を再び使用できるようにします。このループでは一度に不透明にしますので wait() を入れる必要はありません。
-- すべてのパーツを再び歩けるように橋をリセットする
for partIndex = 1, #pathArray do
local whichPart = pathArray[partIndex]
whichPart.CanCollide = true
whichPart.Transparency = 0
end
- プロジェクトをテストして、橋が透明になった後、再び出現するかどうかを確認します。
whileループで繰り返す
現在、橋は消え元に戻りますが、一度だけしか実行されません。何度も繰り返し実行させるには、一連の for ループの外側に while ループを入れ、無限に実行させなくてはなりません。
- 2つの for ループを囲むように、「while true do ~ end」を追加します。
while true do
-- 配列から順番にパーツを消していく
for partIndex = 1, #pathArray do
wait(disappearRate)
local whichPart = pathArray[partIndex]
whichPart.CanCollide = false
whichPart.Transparency = 1
end
-- 橋を再表示させるまで少し待つ
wait(1)
-- すべてのパーツを再び歩けるように橋をリセットする
for partIndex = 1, #pathArray do
local whichPart = pathArray[partIndex]
whichPart.CanCollide = true
whichPart.Transparency = 0
end
end
- すべてのパーツが消えたら、再び現れることを確認します。
トラブルシューティング
この時点で思ったように機能しなかった場合は、以下の項目を確認してください。
最後のパーツが消えない
2 つの for ループの間に短い待ち時間があることを確認します。それがない場合、最後のパーツが消えた後にすぐにリセットされるので早すぎて消えていないように見えます。
スクリプト実行中にエラーで停止する
両方の for ループが while true do と最後の end の間にあることを確認します。
チャレンジ
Parts フォルダーと pathArray に 6 つ以上のパーツを追加してみましょう。
完成したプログラム
local path = script.Parent
local partsFolder = path.Parts
local disappearRate = 1
local pathArray = {
partsFolder.Part1,
partsFolder.Part2,
partsFolder.Part3
}
while true do
-- 配列から順番にパーツを消していく
for partIndex = 1, #pathArray do
wait(disappearRate)
local whichPart = pathArray[partIndex]
whichPart.CanCollide = false
whichPart.Transparency = 1
end
-- 橋を再表示させるまで少し待つ
wait(1)
-- すべてのパーツを再び歩けるように橋をリセットする
for partIndex = 1, #pathArray do
local whichPart = pathArray[partIndex]
whichPart.CanCollide = true
whichPart.Transparency = 0
end
end