巢穴循環

*此內容是使用 AI(Beta 測試版)翻譯,可能含有錯誤。若要以英文檢視此頁面,請按一下這裡

巢穴循環允許您重複任務以批量進行。例如,烘培六個杯子蛋糕的三個批量,或將武器分配給兩個隊伍的玩家。

如何執行行嵌套循環

當迴圈巢穴化時,腳本會一行一行地到達下一個迴圈。內部循環將會運行直到滿足條件才返回外部循環。

巢穴循環邏輯

下面的圖表顯示了循環所需的步驟。

  • 外部循環:代碼會一行一行地運行,直到到達內部循環。:
  • 外環:代碼一行一行地運行,直到到達內環。:
  • 外環:代碼一行一行地運行,直到到達內環。

巢穴循環示例

巢穴循環可能看起來有點抽象,因此視覺示例可以提供幫協助。對於這個練習,複製並粘貼樣本腳本,並在 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. 觀察腳本生成不同批次的彩色零件時。經過一批後,它會暫停 2 秒。外循環中的印表聲明只會在完成內循環一次後運行。

巢穴循環塔

每個循環都有自己的代碼集,因此可以負責不同的任務。巢穴循環可以做的一件事是改變對象生成的位置,創建像這個視頻中的塔一樣的塔。有三種不同的循環,每種都用於控制圓方在塔的寬度、長度和高度上生成的位置。

編寫立方體製作者指令碼

要練習嵌套循環,你會創建一個創建立方塊塔的腳本。對於立方塔指令碼,首先寫一個生成單個立方體的函數。塔將通過反覆呼叫此功能來建造。

設定腳指令碼

對於立方體塔指令碼,首先編寫一個生成單個立方體的函數。塔將通過反覆呼叫此函數來建造。

  1. 刪除 PartMaker 腳本或停用它(在腳本屬性中,檢查為停用)。如果你沒有,會有兩個腳本同時在同一空間製作零件。

  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. makeCube() 中,添加參數 spawnXspawnYspawnZ 。這些數字將設置每個新立方體的生成地點。


    -- 創建個別的立方體
    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

使用嵌套循環重複生成

腳本將有總共三個循環,每個循環長度、寬度和高度各為塔。在向上移動之前完成整個樓層,請先在第一個、最外側的循環中設置 Y 坐標。

  1. 在 函數下,創建一個 for 循環來設置每個立方體生成的高度。

    • 控制變量heightIndex = 1
    • 終點TOWER_SIZE
    • 在循環內,添新增 加至:local spawnY = (高度指數 - 1) * CUBE_SIZE

    -- 建造塔
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. 當第一個循環完成高度時,開始第二個循環。在第一個循環內,添加一個新的循環以在塔的長度上放置立方體。

    • 控制變量 :lengthIndex = 1
    • 終點TOWER_SIZE
    • 在此循環內新增 加至:本地生成X=長度指數*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
--製作單一杯子蛋糕
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

總結

為了完成更複雜的任務,程式員會發現結合多個循環和甚至不同類型的循環很有用。所有循環都可以巢穴化,即一個循環在另一個循環內。巢穴循環遵循與其他任何循環相同的邏輯。它從第一個、最外側的循環開始,通過內部循環執行任務,然後回到第一個循環,如果適用。