【15】配列によるループ

配列while ループや for ループなどのループと組み合わせて、各値に対して同じコードを繰り返すことができます。例えば、配列内の各プレイヤーをテレポートさせたり、配列内のパーツに火をつけたりすることもできます。

下記のコードは、for ループを使って playerArray 内の全てのプレイヤーをテレポートさせています。配列のサイズを示す #playerArray を使用することで、配列の中に何人の値があるかを知る必要はありません。

local playerArray = {}
 
for playerIndex = 1, #playerArray do
    playerToTeleport = playerArray[playerIndex]
    teleportToStart(playerToTeleport)
end

配列のループについて学ぶため、消える道を作成します。これは、数秒に1回配列のパーツが消えるようにすることで作成されます。

プロジェクトを設定する

消える道を作成する

このプロジェクトでは、インデックスされた順番に消えていく一連のパーツを使用します。

  1. パーツおよびスクリプトを保管する DisappearingPath という名前のフォルダーを作成します。このフォルダーの中に、Parts という名前のフォルダーと PathScript という名前のスクリプトを追加します。
  1. Parts に少なくとも3つの橋パーツを追加し、消える順番に名前を変更します。最初は Part1、最後がPart3 となるようにしてください。
  1. PathScript で、DisappearingPathParts フォルダーを格納する変数を作成します。
local path = script.Parent
local partsFolder = path.Parts

パーツの配列を作成する

配列全体を一行に入力するのではなく、この配列に含まれる値はそれぞれ別の行に入力します。1行に1つの値を入力することで、配列が長くなっても読みやすくなります。

  1. パーツの配列を格納するために、local pathArray = { と入力し、[Enter]を押して } をオートコンプリートさせます。
local path = script.Parent
local partsFolder = path.Parts
 
local pathArray = {

}
  1. 配列の { } の間に、Parts フォルダーの各パーツを入力し、カンマで区切ります。最後の値はカンマを必要ありません。また、配列にこれらのパーツを格納するので、それぞれを変数に格納する必要はありません。
local path = script.Parent
local partsFolder = path.Parts
 
local pathArray = {
    partsFolder.Part1,
    partsFolder.Part2,
    partsFolder.Part3
}

配列によるループ

配列に追加された順番で各パーツが消えるようにするため、for ループを使用します。パーツが消えるようにするため、各インデックスを入力することもできますが、ループを使用すれば必要なコードの量を減らすことができ、後にパーツを追加しても変更を加える必要がなくなります。

forループを作成する

  1. 後で自由にパーツが消えるタイミングが調整できるように、dispearRate という名前の変数を作成します。テストのためには、小さな数字にしておくのがベストです。
local disappearRate = 1
  1. 以下のような for ループを作成します。
  • 開始:partIndex = 1、配列の最初の値のインデックス
  • 終了:#pathArray、配列のサイズ
local disappearRate = 1
 
for partIndex = 1, #pathArray  do

end
  1. パーツが消えるまでに遅延が必要なので、for ループの中で先ほどの disappearRate を使って wait() を追加します。
for partIndex = 1, #pathArray  do
    wait(disappearRate)
end
  1. パーツが消えるようにするため、whichPart という名前の変数を作成し、partsArray[partIndex] に設定します。次にこのパーツが消えるようにするため、CanCollideプロパティをfalseに、Transparency1に設定します。
for partIndex = 1, #pathArray  do
    wait(disappearRate)
    local whichPart = pathArray[partIndex]
    whichPart.CanCollide = false
    whichPart.Transparency = 1
end
  1. 道が徐々に消えていくことを確認します。

問題解決のヒント
問題:パーツが消えるのが速すぎる。あるいは、最初から消えている。
disappearRateより大きいことを確認します。
・キャラクターがゲームにロードするのにかかる時間によっては、最初のパーツはすでに消えていることがあります。対策としては、スクリプトの最初に wait(2) などで短い待ち時間を追加します。
問題:スクリプトがクラッシュする。あるいは、実行するとエラーが表示される。
・配列内の各パーツ名がエクスプローラーに表示されているものとまったく同じであることを確認します。例:partsFolder.Part1
・配列の各値がカンマで区切られていることを確認します。ただし、最後の値は不要です。
・特殊記号の間にスペースがないことを確認します。例えば、#pathArray#や、pathArray[partIndex]の[ ]などです。

2番目のforループを作成する

道が再び現れるようにするため、各パーツに作用し、渡れるようにする2つ目のforループを作成します。

  1. 最初のループの後に wait() を追加し、道が再び現れる前に少し遅延があるようにします。
for partIndex = 1, #pathArray  do
    wait(disappearRate)
    local whichPart = pathArray[partIndex]
    whichPart.CanCollide = false
    whichPart.Transparency = 1
end
	
wait(1)
  1. 2つ目の for ループをコーディングし、再び道を歩けるようにしてみましょう。パーツの CanCollide プロパティを true に、Transparency0 に変更します。
-- すべてのパーツを再び歩けるようにして道をリセットする
for partIndex = 1, #pathArray do
    local whichPart = pathArray[partIndex]
    whichPart.CanCollide = true
    whichPart.Transparency = 0
end
  1. すべてのパーツが消えた後、再び現れることを確認します。

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
    -- Make a part disappear from the array in order
    for partIndex = 1, #pathArray  do
        wait(disappearRate)
        local whichPart = pathArray[partIndex]
        whichPart.CanCollide = false
        whichPart.Transparency = 1
    end

    -- Wait for a second before making the path reappear
    wait(1)

    -- Reset the path by making all parts walkable again
    for partIndex = 1, #pathArray do
        local whichPart = pathArray[partIndex]
        whichPart.CanCollide = true
        whichPart.Transparency = 0
    end
end
  1. すべてのパーツが消えた後、再び現れることを確認します。

問題解決のヒント
問題:最後のパーツが消えない
・2つの for ループの間に短い wait() があることを確認します。これがないと、最後のピースが消えた後すぐに、すべてのパーツが瞬時に現れてしまいます。
問題:スクリプトがクラッシュする、あるいは実行するとエラーが表示される。
・両方の for ループが while true do と最後の end の間にあることを確認します。

返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です