ループをネストすることで、タスクをバッチ処理で繰り返すことができます。たとえば、6個のカップケーキを3バッチ焼く、または2チームのプレイヤーに武器を割り当てることが挙げられます。
ネストループの実行方法
ループがネストされている場合、スクリプトは行ごとに実行され、次のループに到達するまで進みます。内側のループは条件が満たされるまで実行され、その後外側のループに戻ります。
ネストループのロジック
次の図は、ループが取るステップを示しています。
| ![]() |
ネストループの例
ネストループは多少抽象的に見えることがありますので、視覚的な例が役立ちます。この演習では、サンプルスクリプトをコピーしてStudioで実行します。このスクリプトは部分の塔を作成します。外側のループは作成する部分の数を制御し、内側のループが実際のバッチを作成します。
ServerScriptService内にPartMakerという名前の新しいスクリプトを作成します。以下のコードをコピーしてください。
local numberOfBatches = 7local partsPerBatch = 5local partsMade = 0-- 一つの立方体を作成するlocal function createPart()local part = Instance.new("Part")part.Size = Vector3.new(2, 2, 2)part.CFrame = CFrame.new(20, 0, 20)part.Color = currentColorpart.Parent = workspaceend-- 外側のループfor partBatch = 1, numberOfBatches doprint("外側のループの上: 部品バッチ " .. partBatch)currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))-- 内側のループfor partNumber = 1, partsPerBatch docreatePart()print("内側のループ: 部品 " .. partNumber)partsMade += 1task.wait(0.5)endprint("外側のループの下: " .. partsMade .. " 個の部品が作成されました。")task.wait(2)endスクリプトが異なる色の部品のバッチを生成するのを見てください。1つのバッチが完了した後は、2秒間ポーズします。外側のループのprint文は、完了した内側のループごとに1回だけ実行されます。
ネストされたforループの塔
各ループには独自のコードセットがあるため、異なるタスクを担当できます。ネストループができることの1つは、オブジェクトの生成位置を変更して、次のビデオのような塔を作成することです。塔の幅、長さ、高さに沿った立方体の生成場所を制御するために、3つの異なるループがそれぞれあります。
立方体生成スクリプトをコーディング
ネストループを練習するために、立方体の塔を作成するスクリプトを作成します。立方体塔のスクリプトでは、最初に単一の立方体を生成する関数をコーディングします。この塔は、この関数を繰り返し呼び出すことによって作成されます。
スクリプトの設定
立方体塔のスクリプトでは、まず単一の立方体を生成する関数をコーディングします。この塔は、この関数を繰り返し呼び出すことによって作成されます。
PartMakerスクリプトを削除するか、無効にします(スクリプトのプロパティで、無効にチェックを入れます)。そうしないと、同じ場所で2つのスクリプトが同時に部品を作成してしまいます。
TowerBuilderという名前の新しいスクリプトを作成します。先頭に塔のサイズと立方体のサイズの変数を追加します。
local TOWER_SIZE = 4local CUBE_SIZE = 2makeCube()という名前のローカル関数を追加し、CUBE_SIZEを使用して単一の正方形の立方体を生成します。
local TOWER_SIZE = 4local CUBE_SIZE = 2-- 個別の立方体を生成するlocal function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)end立方体の色をネストループ内で更新される変数に設定します。
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorend最後に、新しい立方体をワークスペースの親として設定して表示させます。
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
異なる方向に生成
塔を作成するには、各新しい立方体のX、Y、Zプロパティを設定して特定のポイントに立方体を生成します。XとZは横方向、Yは上下方向です。
makeCube()内で、spawnX、spawnY、spawnZのパラメータを追加します。これらの数字が各新しい立方体の生成場所を設定します。
-- 個別の立方体を生成するlocal function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend関数内で、立方体のCFrameプロパティを、spawnX、spawnY、spawnZパラメータを使用して新しいCFrameに設定します。
local function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)cube.Parent = workspaceend
ネストループを使用して生成
スクリプトには合計3つのループがあり、塔の長さ、幅、高さそれぞれに対応します。全てのフロアを完成させてから上に移動するために、まず最初の外側のループでY座標を設定します。
makeCube()関数の下に、各立方体がどれだけ高く生成されるかを設定するためのforループを作成します。
- 制御変数: heightIndex = 1
- 終了ポイント: TOWER_SIZE
- ループ内で、local spawnY = (heightIndex - 1) * CUBE_SIZEを追加します。
-- タワーを構築for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEend高さのための最初のループが終わったら、2つ目のループに進みます。最初のforループ内で、塔の長さに沿った立方体の配置を行うための新しいforループを追加します。
- 制御変数: lengthIndex = 1
- 終了ポイント: TOWER_SIZE
- そのループ内に、local spawnX = lengthIndex * CUBE_SIZEを追加します。
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendend2つ目のループ内に、塔の幅に対応する3つ目のためのforループを追加します。この最後のループ内でmakeCube()を呼び出し、X、Y、Zのパラメータを渡します。
- 制御変数: widthIndex = 1
- 終了ポイント: TOWER_SIZE
- ループ内で以下を追加します:
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- タワーが構築されるのを見るために、0.25の待機時間を設定します。
-- タワーを構築for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEfor widthIndex = 1, TOWER_SIZE dolocal spawnZ = widthIndex * CUBE_SIZEmakeCube(spawnX, spawnY, spawnZ)task.wait(0.25)endendend各フロアがランダムな色になるように、currentColorを新しいフロアを作成する同じループ内でランダムなRGB番号に変更します。
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEcurrentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))for lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEfor widthIndex = 1, TOWER_SIZE dolocal spawnZ = widthIndex * CUBE_SIZEmakeCube(spawnX, spawnY, spawnZ)task.wait(0.25)endendendプロジェクトを実行し、出力ウィンドウにエラーがないことを確認しながら、完全な塔が作成されるのを待ちます。
オプションのチャレンジ
以下は、さまざまな方法でネストループを使用する自己主導のチャレンジです。解決策を見る前に、自分でコーディングしてみてください。
部品をフェードアウトさせる
塔が構築されるにつれて、左から右に向かって部品を透明度でフェードインさせます。

以下にコードソリューションを示します。
local TOWER_SIZE = 6
local CUBE_SIZE = 2
-- 個別の立方体を生成する
local function makeCube(spawnX, spawnY, spawnZ)
local cube = Instance.new("Part")
cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
cube.Color = currentColor
cube.Transparency = cubeTransparency -- 透明度を設定
cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
cube.Parent = workspace
end
-- タワーを構築
for heightIndex = 1, TOWER_SIZE do
local spawnY = (heightIndex - 1) * CUBE_SIZE
currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
for lengthIndex = 1, TOWER_SIZE do
local spawnX = lengthIndex * CUBE_SIZE
cubeTransparency = (lengthIndex - 1) * 0.10 -- 0から始めて毎ループで更新
for widthIndex = 1, TOWER_SIZE do
local spawnZ = widthIndex * CUBE_SIZE
makeCube(spawnX, spawnY, spawnZ)
task.wait(0.05)
end
end
end
オブジェクトを降らせる
部品の代わりに実際のオブジェクトを生成してみましょう。ここではカップケーキを使用しています。
自分で以下を試してみてください:
- 基本部品からオブジェクトを作成する。すべての部品を一緒に溶接して、オブジェクトが崩れないようにします。
- オブジェクトをServerStorageに配置します。
- ネストループの例で見つけたPartMakerを修正して、部品の代わりにあなたのオブジェクトを使用します。
以下に例を示します。
カップケーキを使用したコードソリューションが含まれています。
local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
-- 一つのカップケーキを作成する
local function makeCupcake()
local ServerStorage = game:GetService("ServerStorage")
local cupcake = ServerStorage.Cupcake:Clone()
local cup = cupcake.Cup
local frosting = cupcake.Frosting
cupcake:SetPrimaryPartCFrame(CFrame.new(0, 20, 0) * CFrame.Angles(0, 0, -90))
frosting.Color = frostingColor
cup.Color = cupColor
cupcake.Parent = workspace
end
-- 外側のループ
for cupcakeBatch = 1, numberOfBatches do
print("外側のループの上: カップケーキバッチ " .. cupcakeBatch)
frostingColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
cupColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))
-- 内側のループ
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("内側のループ: カップケーキ " .. cupcakeNumber)
-- 焼かれたカップケーキを追跡
cupcakesBaked += 1
task.wait(0.5)
end
print("外側のループの下: " .. cupcakesBaked .. " 個のカップケーキが焼かれました。")
end
まとめ
より複雑なタスクを達成するために、コーダーは複数のループを組み合わせたり、異なるタイプのループを使用したりすることが役立ちます。すべてのループはネスト可能であり、1つのループが別のループの内部に存在します。ネストループは他のループと同じロジックに従います。最初の外側のループを開始し、内側のループを通じてタスクを実行し、該当する場合は最初のループに戻ります。
