嵌套迴圈讓您可以批次重複任務。例如,烘焙三批六個杯子蛋糕,或在兩支隊伍上分配武器。
嵌套迴圈的運行方式
當迴圈嵌套時,腳本逐行執行,直到達到下一個迴圈。內部迴圈會執行直到滿足條件後再返回到外部迴圈。
嵌套迴圈邏輯
以下圖表顯示迴圈所經歷的步驟。
| ![]() |
嵌套迴圈示例
嵌套迴圈可能會有些抽象,因此視覺示例可以幫助理解。在本練習中,複制並粘貼一個示例腳本,並在 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觀看此腳本生成不同顏色的部件批。在經過一批之後,將暫停 2 秒。外部迴圈中的 print 語句將僅在完成的內部迴圈中執行一次。
嵌套 for 迴圈塔
每個迴圈都有自己的一組代碼,因此可以負責不同的任務。嵌套迴圈可以做的一件事是改變物體生成的位置,以創建像這段視頻中的塔。共有三個不同的迴圈,每個迴圈用於控制立方體在塔的寬度、長度和高度上的生成位置。
編碼立方體生成器腳本
為了練習嵌套迴圈,您將編寫一個創建立方體塔的腳本。對於立方體塔腳本,首先編寫一個生成單個立方體的函數。塔的構建將通過重複調用此函數來實現。
設置腳本
對於立方體塔腳本,首先編寫一個生成單個立方體的函數。塔的構建將通過重複調用此函數來實現。
刪除 PartMaker 腳本或禁用它(在腳本屬性中,檢查禁止)。如果不這樣做,將會有兩個腳本在相同位置同時生成部件。
創建一個名為 TowerBuilder 的新腳本。在頂部添加塔的大小和立方體大小的變量。
local TOWER_SIZE = 4local CUBE_SIZE = 2添加一個名為 makeCube() 的本地函數,使用 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
使用嵌套迴圈生成
腳本將包含三個迴圈,每個迴圈分別用於塔的長度、寬度和高度。為了在向上移動之前完成整個樓層,首先設置 Y 坐標在第一個外部迴圈中。
在 makeCube() 函數下,創建一個 for 迴圈以設置每個立方體生成的 高度。
- 控制變量:heightIndex = 1
- 終點:TOWER_SIZE
- 在迴圈內添加:local spawnY = (heightIndex - 1) * CUBE_SIZE
-- 構建塔for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEend在第一個高度迴圈完成後,開始第二個。將新的 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在 第二 個迴圈內,添加一個 第三 個 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
總結
為了完成更複雜的任務,開發者會發現結合多個迴圈,甚至不同類型的迴圈是有幫助的。所有迴圈都可以嵌套,這意味著一個迴圈就在另一個迴圈裡面。嵌套迴圈遵循與其他迴圈相同的邏輯。它從第一個最外部的迴圈開始,通過內部迴圈執行任務,然後如果適用,循環回到第一個迴圈。
