5-2 ループと配列

配列をwhile ループやforループなどのループと組み合わせて、インデックス付きの値ごとに同じコードを繰り返すことができます。たとえば、配列内の各プレイヤーを新しい場所にテレポートしたり、配列内のパーツを発火させたりできます。
配列にパーツを入れて置き 1 つずつ消滅させる、消える橋を作成します。

配列をループする

プロジェクトでは、非表示にする 3 つのパーツで構成された橋を作成します。パーツはすべてアンカー設定で固定してください。

  1. 3つのパーツを作成します。消える順序で Part1、Part2、Part3 と名前を付けます。
  2. ServerScriptService で、新しいスクリプトを挿入し、パーツを格納する配列を作成します。
local pathArray = {
}
  1. それぞれ 1 行に、非表示にする順序でパーツの名前を入力します。値ごとに改行すると読みやすくなります。
local pathArray = {
    workspace.Part1,
    workspace.Part2,
    workspace.Part3,
}

配列での for ループの使用

for ループを使用して配列を調べ、配列内でパーツのインデックスが付けられた順序でパーツが消える速度を制御します。

  1. パーツが消える頻度を秒単位で制御するには、VANISH_RATEという名前の変数を作成します。テストの場合は、小さい数に抑えるのが最善です。
local VANISH_RATE = 1.5

 local pathArray = {
    workspace.Part1,
    workspace.Part2,
    workspace.Part3
}
定数は、調整が必要になる可能性が高い変数として位置付けられます。これらは見つけやすいように、プログラムの先頭の方に、すべて英大文字で名付けます。定数は、スクリプト内の他のコードによって変更してはいけないというルールがあります。
  1. for ループを作成します。
    partIndex の開始は1から、終了は配列のサイズ、つまりこの例では3になります。
for partIndex = 1, #pathArray  do

end
  1. パーツを消した後、少し待たなくてはいけないため、ループ内でVANISH_RATEを使用したtask.wait()を追加します。
for partIndex = 1, #pathArray  do
    task.wait(VANISH_RATE)
end
  1. パーツを非表示にするには、 whatPart という名前の変数を作成し、 PartsArray[partIndex] の値を代入します。次に、その部分を非表示にするには、 CanCollideプロパティを false に設定し、 Transparencyを 1 に設定します。
for partIndex = 1, #pathArray  do
    task.wait(VANISH_RATE)
    local whichPart = pathArray[partIndex]
    whichPart.CanCollide = false
    whichPart.Transparency = 1
end
  1. パスの一部が時間の経過とともに消えることを確認します。

トラブルシューティング

この時点で橋が消えないか、全く橋が見えない場合は、次の項目を確認してください。

パーツがすぐに消えてしまうか、最初にすべてなくなってしまう

  • disappearRatが 1 より大きいことを確認してください。
  • ゲームを実行した後に、キャラクターが作られるまでに時間がかかります。よって最初の橋がすでに消えてしまっている場合があります。これに対処するには、for 文の前に「task.wait(2)」などと入力し、橋が消えるまでに少し待つといいでしょう。

2 番目のループのコーディング

このままでは、橋は永遠に消え続けます。それらを再表示するには、もう1つ for ループを作成し、全パーツをリセットして橋を歩けるようにしなくてはなりません。

  1. 最初の for ループの後に task.wait() を追加して、橋が再表示されるまでの待機時間を設けます。
for partIndex = 1, #pathArray  do
    task.wait(VANISH_RATE)
    local whichPart = pathArray[partIndex]
    whichPart.CanCollide = false
    whichPart.Transparency = 1
 end

 task.wait(1)
  1. 橋の各パーツの CanCollide プロパティを true に、Transparency を 0 に変更して、橋を再び使用できるようにします。このループでは一度に不透明にしますので task.wait() を入れる必要はありません。
-- すべてのパーツを再び歩けるように橋をリセットする
for partIndex = 1, #pathArray do
    local whichPart = pathArray[partIndex]
    whichPart.CanCollide = true
    whichPart.Transparency = 0
end
  1. プロジェクトをテストして、橋が透明になった後、再び出現するかどうかを確認します。

whileループで繰り返す

現在、橋は消え元に戻りますが、一度だけしか実行されません。何度も繰り返し実行させるには、一連の for ループの外側に while ループを入れ、無限に実行させなくてはなりません。

  1. 2つの for ループを囲むように、「while true do ~ end」を追加します。
while true do
    -- 配列から順番にパーツを消していく
    for partIndex = 1, #pathArray  do
        task.wait(VANISH_RATE)
        local whichPart = pathArray[partIndex]
        whichPart.CanCollide = false
        whichPart.Transparency = 1
    end

    -- 橋を再表示させるまで少し待つ
    task.wait(1)

    -- すべてのパーツを再び歩けるように橋をリセットする
    for partIndex = 1, #pathArray do
        local whichPart = pathArray[partIndex]
        whichPart.CanCollide = true
        whichPart.Transparency = 0
    end
end
  1. すべてのパーツが消えたら、再び現れることを確認します。

完成したプログラム

local VANISH_RATE = 1.0

local pathArray = {
    workspace.Part1,
    workspace.Part2,
    workspace.Part3,
 }

 while true do
    -- 配列から順番にパーツを消していく
    for partIndex = 1, #pathArray  do
        task.wait(VANISH_RATE)
        local whichPart = pathArray[partIndex]
        whichPart.CanCollide = false
        whichPart.Transparency = 1
    end

    -- 橋を再表示させるまで少し待つ
    task.wait(1)

    -- すべてのパーツを再び歩けるように橋をリセットする
    for partIndex = 1, #pathArray do
        local whichPart = pathArray[partIndex]
        whichPart.CanCollide = true
        whichPart.Transparency = 0
    end
end

配列と ipairs()

ipairs()は配列とともに使用されます。ipairs()の「i」は「インデックス」を表します。ipairs() を使用すると、パーツでいっぱいのフォルダーなど、多数のオブジェクトに対する操作をすばやく繰り返すことができます。
フォルダーのすべてのパーツにパーティクルを追加するプログラムを作成してみます。

  1. ワークスペースで、PartsFolder という名前のフォルダーを作成します。好きなだけパーツを追加してください。
  2. ServerScriptService で、新しいスクリプトを作成し、フォルダーを参照します。
  3. GetChildren() を使用して、フォルダー内のすべてのオブジェクトを取得します。この関数はリストになった配列を返します。
local partsFolder = workspace.PartsFolder

-- PartsFolder 内のパーツのリストを配列で取得
local partsArray = partsFolder:GetChildren()
  1. for ループでipairs(ArrayToUse) を使用して、partsArray を通過し、パーティクルを追加します。
-- PartsFolder 内のパーツのリストを配列で取得
 local partsArray = partsFolder:GetChildren()

 -- 配列内のすべてのパーツにパーティクルを追加する
 for index, part in ipairs(partsArray) do
     local particles = Instance.new("ParticleEmitter")
     particles.Parent = part
 end

テストプレイして、フォルダー内のあらゆるパーツからパーティクルが浮き上がるのを見てください。

まとめ

ループを配列と組み合わせて、任意の数の値を迅速に操作できます。いくつかの部分に何が起こるか、どのような順序で行われるかを正確に制御したい場合は、配列を特定の値でハードコーディングする必要があります。
順序が重要ではない多くの部分を操作するために、GetChildren() はオブジェクトの子の配列を作成できます。ipairs()を利用すると、配列のサイズを知らなくてもリストを素早く反復処理できます。

コメントを残す