ネストされたループ

*このコンテンツは、ベータ版のAI(人工知能)を使用して翻訳されており、エラーが含まれている可能性があります。このページを英語で表示するには、 こちら をクリックしてください。

ネストリングループは、バッチでタスクを繰り返すことができます。たとえば、6つのカップケーキのバッチを焼くか、2つのチームのプレイヤーに武器を割り当てるなどです。

ネストされたループの実行方法

ループがネストされていると、スクリプトは次のループに到達するまで行ごとに実行されます。内部ループは、外部ループに戻る前に条件が満たされるまで実行されます。

ネストされたループロジック

次の図では、ループが実行するステップを示します。

  • 外部ループ: 内部ループに到達するまでコードが行ごとに実行されます。:
  • 外部ループ: コードは内部ループに到達するまで行ごとに実行されます。:
  • 外側ループ: 内部ループに到達するまでコードが行ごとに実行されます。

巣子ループの例

ネストされたループは若干抽象的に見えるため、視覚的な例がヘルプに立つ可能性があります。このエクササイズでは、サンプルスクリプトをコピーして貼り付け、Studio で実行します。このスクリプトは、パーツの塔を作成します。外側のループは、どれくらいのパーツを作成するかを制御し、内側のループは実際のバッチを作成します。

  1. ServerScriptService に新しいスクリプトを作成し、PartMakerという名前を付けます。以下のコードをコピーします。


    local numberOfBatches = 7
    local partsPerBatch = 5
    local 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 = currentColor
    part.Parent = workspace
    end
    -- 外側のループ
    for partBatch = 1, numberOfBatches do
    print("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 do
    createPart()
    print("Inner loop: part " .. partNumber)
    partsMade += 1
    task.wait(0.5)
    end
    print("Bottom outer loop: " .. partsMade .. " parts made so far.")
    task.wait(2)
    end
  2. スクリプトが異なる色のパーツのバッチを生成するのを見る1つのバッチを通過した後、2秒間停止します。外部ループの印字文は、内部ループを完了するたびに 1回だけ実行されます。

ループタワーをネストする

それぞれのループには独自のコードセットがあるので、異なるタスクの責任者になることができます。ネストループができる1つのことは、オブジェクトがスポーンする場所の配置を変更して、このビデオのようなタワーを作成することです。幅、長さ、高さの塔の箇所でキューブがスポーンする場所を制御するのに、それぞれ異なる 3つのループがあります。

立方体作成スクリプトをコードする

ネスト型ループを練習するには、キューブの塔を作成するスクリプトを作成します。キューブタワースクリプトの場合、最初に単一のキューブを生成する機能をコード化します。タワーは、この関数を繰り返し呼び出して構築されます。

スクリプトを設定する

キューブタワースクリプトの場合、最初に単一のキューブを生成する機能をコード化します。タワーは、この機能を繰り返し呼び出すことで構築されます。

  1. パーツメーカースクリプトを削除する または無効にする (スクリプトプロパティで、無効をチェック)。そうしないと、同じ場プレースで同時にパーツを作る 2つのスクリプトがあります。

  2. 新しいスクリプト「TowerBuilder」を作成します。上部にタワーサイズとキューブサイズの変数を追加します。


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
  3. makeCube() を使用して単一の正方形の立方体を作成するローカル機能を名前として追加します CUBE_SIZE


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
    -- 個々のキューブを作成
    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    end
  4. キューブの色をネストされたループで更新される変数に設定します。


    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    end
  5. 最後に、 新しいキューブをワークスペースに追加して表示されます。


    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    cube.Parent = workspace
    end

異なる方向でスポーンする

タワーを作成するには、新しいキューブの X、Y、Z プロパティを設定して、特定のポイントでキューブをスポーンします。X と Z は横向きです。Y は上下です。

  1. 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 = currentColor
    cube.Parent = workspace
    end
  2. 機能内で、spawnXspawnYspawnZ パラメータを使用して、キューブの 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 = currentColor
    cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
    cube.Parent = workspace
    end

ネストされたループでスポーンする

スクリプトには、タワーの長さ、幅、高さのそれぞれに対する合計 3 ループがあります。上昇する前に全階を完了するには、最初の、最も外側のループで Y 座標を設定して始めます。

  1. 関数の下で、各キューブがスポーンする頻度を設定する for ループを作成します。

    • コントロール変数 : heightIndex = 1
    • 終端ポイント : TOWER_SIZE
    • ループ内で追加: local spawnY = (heightIndex - 1) * CUBE_SIZE

    -- タワーをビルドする
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. 高さの最初のループが終わったので、2番目を開始します。最初の for ループ内で、キューブを塔の長さ沿いに配置する場所の新しい for ループを追加します。

    • コントロール変数 : lengthIndex = 1
    • 終端ポイント : TOWER_SIZE
    • ループ内で追加: local spawnX = lengthIndex * CUBE_SIZE

    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    end
    end
  3. ループ内で、タワーの のループ用に 第三 を追加します。この最後のループでは、makeCube() を呼び出し、X、Y、Z パラメータを渡します。

    • コントロール変数 : widthIndex = 1
    • 終端ポイント : TOWER_SIZE
    • ループ内で追加する:
      • local spawnZ = widthIndex * CUBE_SIZE
      • makeCube(spawnX, spawnY, spawnZ)
      • タワーが建設されるのを見るための待機時間 0.25

    -- タワーをビルドする
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    for widthIndex = 1, TOWER_SIZE do
    local spawnZ = widthIndex * CUBE_SIZE
    makeCube(spawnX, spawnY, spawnZ)
    task.wait(0.25)
    end
    end
    end
  4. それぞれの階がランダムな色になるように、新しい階を作成する同じループで currentColor をランダムな RGB 番号に変更します。


    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
    for widthIndex = 1, TOWER_SIZE do
    local spawnZ = widthIndex * CUBE_SIZE
    makeCube(spawnX, spawnY, spawnZ)
    task.wait(0.25)
    end
    end
    end
  5. プロジェクトを実行し、出力ウィンドウにエラーがなく完全なタワーが作成されたかどうかを確認するまで待ちます。

オプションのチャレンジ

以下は、異なる方法でネストされたループを使用する異なる自律型のチャレンジです。解決策を見る前に、自分でコードを試してみてください。

消えていくパーツ

タワーが建設されると、左から右に透明度が薄くなるパーツがあります。

コードソリューションは以下です。


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つのループの中に入っていることを意味します。ネストされたループは、他のどのループとも同じロジックを追います。最初の、最も外側のループで開始し、内部ループを通じてタスクを実行し、適用可能用する場合は最初のループに戻ります。