ネストリングループは、バッチでタスクを繰り返すことができます。たとえば、6つのカップケーキのバッチを焼くか、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("Top outer loop: part batch " .. partBatch)currentColor = Color3.fromRGB(math.random(0, 255), math.random(0, 255), math.random(0, 255))-- 内部ループfor partNumber = 1, partsPerBatch docreatePart()print("Inner loop: part " .. partNumber)partsMade += 1task.wait(0.5)endprint("Bottom outer loop: " .. partsMade .. " parts made so far.")task.wait(2)endスクリプトが異なる色のパーツのバッチを生成するのを見る1つのバッチを通過した後、2秒間停止します。外部ループの印字文は、内部ループを完了するたびに 1回だけ実行されます。
ループタワーをネストする
それぞれのループには独自のコードセットがあるので、異なるタスクの責任者になることができます。ネストループができる1つのことは、オブジェクトがスポーンする場所の配置を変更して、このビデオのようなタワーを作成することです。幅、長さ、高さの塔の箇所でキューブがスポーンする場所を制御するのに、それぞれ異なる 3つのループがあります。
立方体作成スクリプトをコードする
ネスト型ループを練習するには、キューブの塔を作成するスクリプトを作成します。キューブタワースクリプトの場合、最初に単一のキューブを生成する機能をコード化します。タワーは、この関数を繰り返し呼び出して構築されます。
スクリプトを設定する
キューブタワースクリプトの場合、最初に単一のキューブを生成する機能をコード化します。タワーは、この機能を繰り返し呼び出すことで構築されます。
パーツメーカースクリプトを削除する または無効にする (スクリプトプロパティで、無効をチェック)。そうしないと、同じ場プレースで同時にパーツを作る 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 は上下です。
In makeCube() , add parameters for spawnX , spawnY , and 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機能内で、spawnX、spawnY、spawnZ パラメータを使用して、キューブの CFrame プロパティを新しい 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 座標を設定して始めます。
関数の下で、各キューブがスポーンする頻度を設定する 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_SIZEendend秒 ループ内で、タワーの 幅 のループ用に 第三 を追加します。この最後のループでは、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 に配置する
- ネストループの例 で見つかったパーツメーカーを変更して、パーツの代わりにオブジェクトを使用する
サンプルがここに表示されます。
カップケーキを使用したコードソリューションが含まれます。
local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--1つのカップケーキを作る
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("Top outer loop: cupcake batch " .. 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("Inner loop: cupcake " .. cupcakeNumber)
-- 焼かれたトラックマフィン
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end
概要
より複雑なタスクを達成するには、コーダーは複数のループや異なる種類のループを組み合わせるのが便利であると見つけるでしょう。すべてのループはネストでき、つまり 1つのループがもう 1つのループの中に入っていることを意味します。ネストされたループは、他のどのループとも同じロジックを追います。最初の、最も外側のループで開始し、内部ループを通じてタスクを実行し、適用可能用する場合は最初のループに戻ります。