配列は while ループや for ループなどのループと組み合わせて、各値に対して同じコードを繰り返すことができます。例えば、配列内の各プレイヤーをテレポートさせたり、配列内のパーツに火をつけたりすることもできます。
下記のコードは、for ループを使って playerArray 内の全てのプレイヤーをテレポートさせています。配列のサイズを示す #playerArray を使用することで、配列の中に何人の値があるかを知る必要はありません。
local playerArray = {}
for playerIndex = 1, #playerArray do
playerToTeleport = playerArray[playerIndex]
teleportToStart(playerToTeleport)
end
配列のループについて学ぶため、消える道を作成します。これは、数秒に1回配列のパーツが消えるようにすることで作成されます。
プロジェクトを設定する
消える道を作成する
このプロジェクトでは、インデックスされた順番に消えていく一連のパーツを使用します。
- パーツおよびスクリプトを保管する DisappearingPath という名前のフォルダーを作成します。このフォルダーの中に、Parts という名前のフォルダーと PathScript という名前のスクリプトを追加します。
- Parts に少なくとも3つの橋パーツを追加し、消える順番に名前を変更します。最初は Part1、最後がPart3 となるようにしてください。
- PathScript で、DisappearingPath と Parts フォルダーを格納する変数を作成します。
local path = script.Parent
local partsFolder = path.Parts
パーツの配列を作成する
配列全体を一行に入力するのではなく、この配列に含まれる値はそれぞれ別の行に入力します。1行に1つの値を入力することで、配列が長くなっても読みやすくなります。
- パーツの配列を格納するために、local pathArray = { と入力し、[Enter]を押して } をオートコンプリートさせます。
local path = script.Parent
local partsFolder = path.Parts
local pathArray = {
}
- 配列の { } の間に、Parts フォルダーの各パーツを入力し、カンマで区切ります。最後の値はカンマを必要ありません。また、配列にこれらのパーツを格納するので、それぞれを変数に格納する必要はありません。
local path = script.Parent
local partsFolder = path.Parts
local pathArray = {
partsFolder.Part1,
partsFolder.Part2,
partsFolder.Part3
}
配列によるループ
配列に追加された順番で各パーツが消えるようにするため、for ループを使用します。パーツが消えるようにするため、各インデックスを入力することもできますが、ループを使用すれば必要なコードの量を減らすことができ、後にパーツを追加しても変更を加える必要がなくなります。
forループを作成する
- 後で自由にパーツが消えるタイミングが調整できるように、dispearRate という名前の変数を作成します。テストのためには、小さな数字にしておくのがベストです。
local disappearRate = 1
- 以下のような for ループを作成します。
- 開始:partIndex = 1、配列の最初の値のインデックス
- 終了:#pathArray、配列のサイズ
local disappearRate = 1
for partIndex = 1, #pathArray do
end
- パーツが消えるまでに遅延が必要なので、for ループの中で先ほどの disappearRate を使って wait() を追加します。
for partIndex = 1, #pathArray do
wait(disappearRate)
end
- パーツが消えるようにするため、whichPart という名前の変数を作成し、partsArray[partIndex] に設定します。次にこのパーツが消えるようにするため、CanCollideプロパティをfalseに、Transparencyを1に設定します。
for partIndex = 1, #pathArray do
wait(disappearRate)
local whichPart = pathArray[partIndex]
whichPart.CanCollide = false
whichPart.Transparency = 1
end
- 道が徐々に消えていくことを確認します。
問題解決のヒント
問題:パーツが消えるのが速すぎる。あるいは、最初から消えている。
・disappearRateが1より大きいことを確認します。
・キャラクターがゲームにロードするのにかかる時間によっては、最初のパーツはすでに消えていることがあります。対策としては、スクリプトの最初に wait(2) などで短い待ち時間を追加します。
問題:スクリプトがクラッシュする。あるいは、実行するとエラーが表示される。
・配列内の各パーツ名がエクスプローラーに表示されているものとまったく同じであることを確認します。例:partsFolder.Part1
・配列の各値がカンマで区切られていることを確認します。ただし、最後の値は不要です。
・特殊記号の間にスペースがないことを確認します。例えば、#pathArray の#や、pathArray[partIndex]の[ ]などです。
2番目のforループを作成する
道が再び現れるようにするため、各パーツに作用し、渡れるようにする2つ目のforループを作成します。
- 最初のループの後に wait() を追加し、道が再び現れる前に少し遅延があるようにします。
for partIndex = 1, #pathArray do
wait(disappearRate)
local whichPart = pathArray[partIndex]
whichPart.CanCollide = false
whichPart.Transparency = 1
end
wait(1)
- 2つ目の for ループをコーディングし、再び道を歩けるようにしてみましょう。パーツの CanCollide プロパティを true に、Transparency を0 に変更します。
-- すべてのパーツを再び歩けるようにして道をリセットする
for partIndex = 1, #pathArray do
local whichPart = pathArray[partIndex]
whichPart.CanCollide = true
whichPart.Transparency = 0
end
- すべてのパーツが消えた後、再び現れることを確認します。
whileループを作成する
道が繰り返し消えるようにするため、for ループを while true do ループに入れることができます。
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
-- 再表示する前に1秒待つ
wait(1)
-- 再び歩けるように全パーツをリセットする
for partIndex = 1, #pathArray do
local whichPart = pathArray[partIndex]
whichPart.CanCollide = true
whichPart.Transparency = 0
end
end
- すべてのパーツが消えた後、再び現れることを確認します。
問題解決のヒント
問題:最後のパーツが消えない
・2つの for ループの間に短い wait() があることを確認します。これがないと、最後のピースが消えた後すぐに、すべてのパーツが瞬時に現れてしまいます。
問題:スクリプトがクラッシュする、あるいは実行するとエラーが表示される。
・両方の for ループが while true do と最後の end の間にあることを確認します。
[ 【14】配列の使用と作成 ]
[ 【16】配列に変更を加える ]