ลูปซ้อนกันช่วยให้คุณสามารถทำซ้ำงานในชุดได้ ตัวอย่างเช่น อบสามชุดของคัพเค้กหกชิ้นหรือการมอบอาวุธให้กับผู้เล่นในสองทีม
วิธีที่ลูปซ้อนกันทำงาน
เมื่อลูปซ้อนกันแล้ว สคริปต์จะไปเรียงตามลำดับจนกว่าจะถึงลูปถัดไปลูปภายในจะทำงานจนกว่าจะตรงตามเงื่อนไขก่อนที่จะกลับไปยังลูปภายนอก
โลจิกภายในลูปซ้อนกัน
ไดอะแกรมต่อไปนี้แสดงขั้นตอนที่วงลูปใช้
| ![]() |
ตัวอย่างลูปซ้อนกัน
ลูปซ้อนกันอาจดูเหมือนเป็นตัวอย่างที่ค่อนข้างเฉย ดังนั้นตัวอย่างภาพกราฟิกสามารถช่วยได้สําหรับการออกกําลังกายนี้ คัดลอกและวางสคริปต์ตัวอย่างและรันใน 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ดูเมื่อสคริปต์สร้างชุดส่วนสีที่แตกต่างกันหลังจากผ่านไปหนึ่งชุด มันจะหยุดชั่วครู่เป็นเวลา 2 วินาทีคำสั่งพิมพ์ในลูปภายนอกจะทำงานเพียงครั้งเดียวต่อการทำลูปภายในเสร็จสมบูรณ์
ซ้อนภายในสําหรับหอคอยลูป
แต่ละลูปมีชุดโค้ดของตัวเองจึงสามารถรับผิดชอบต่องานที่แตกต่างกันได้สิ่งหนึ่งที่ลูปซ้อนกันสามารถทำได้คือเปลี่ยนตำแหน่งที่วัตถุจะเกิดเพื่อสร้างทาวเวอร์เช่นในวิดีโอนี้มีสามลูปที่แตกต่างกันหนึ่งลูปสำหรับการควบคุมตำแหน่งที่ตามความกว้าง ความยาว และความสูงของทาวเวอร์ที่ลูกบาศก์จะเกิด
เขียนสคริปต์ผู้สร้างลูกบาศก์
เพื่อฝึกซ้อมลูปซ้อนกันคุณจะสร้างสคริปที่สร้างทาวเวอร์ของลูกบาศก์สำหรับสคริปต์ทาวเวอร์ลูกบาศก์แรกให้เขียนโค้ดฟังก์ชันที่สร้างลูกบาศก์เดียวหอจะถูกสร้างโดยเรียกฟังก์ชันนี้ซ้ำแล้วซ้ำอีก
ตั้งค่าสคริปต์
สำหรับสคริปต์ทาวเวอร์ลูกบาศก์แรกให้เขียนฟังก์ชันที่สร้างลูกบาศก์เดียวก่อน ทาวเวอร์จะถูกสร้างโดยเรียกฟังก์ชันนี้ซ้ำแล้วซ้ำอีก
ลบ สคริปต์ 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 ของลูกบาศก์เป็น CFrame ใหม่โดยใช้ 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.CFrame = CFrame.new(spawnX, spawnY, spawnZ)cube.Parent = workspaceend
จุดเกิดด้วยลูปซ้อนกัน
สคริปต์จะมีลูปทั้งหมดสามลูป, ลูปละหนึ่งสำหรับความยาว ความกว้าง และความสูงของทาวเวอร์เพื่อเสร็จสิ้นชั้นทั้งหมดก่อนที่จะย้ายขึ้นไป เริ่มต้นด้วยการตั้งค่าพิกัด Y ในลูปแรกและล่าสุด
ภายใต้ฟังก์ชัน makeCube() สร้างลูปสำหรับการตั้งค่าวิธีที่ สูง แต่ละลูกบาศจะเกิดขึ้น
- ตัวแปรควบคุม : heightIndex = 1
- จุดสิ้นสุด : TOWER_SIZE
- ภายในลูปเพิ่ม: spawnY ท้องถิ่น = (หน่วยความสูง - 1) * CUBE_SIZE
-- สร้างหอคอยfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEendเมื่อวนซ้ำครั้งแรกสำหรับความสูงเสร็จแล้ว เริ่มในครั้งที่สองภายในลูปแรกสำหรับลูปเพิ่มลูปใหม่สำหรับสถานที่ที่จะวางลูกบาศก์ตามความยาวของทาวเวอร์
- ตัวแปรควบคุม : lengthIndex = 1
- จุดสิ้นสุด : TOWER_SIZE
- ภายในลูปนั้นเพิ่ม: spawnX ท้องถิ่น = ความยาวของดัชนี * 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
- ปรับแต่ง 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("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
สรุป
เพื่อทําภารกิจที่ซับซ้อนมากขึ้น นักเขียนโค้ดจะพบว่าเป็นประโยชน์ที่จะรวมลูปหลายตัวและแม้แต่ประเภทลูปที่แตกต่างกันลูปทั้งหมดสามารถซ้อนกันได้ หมายความว่าลูปหนึ่งอยู่ภายในอีกลูปหนึ่งลูปซ้อนกันทำตามโลจิกเดียวกับลูปอื่นใด ๆมันเริ่มต้นในลูปแรกและลูปสุดท้าย, ดำเนินการภารกิจผ่านลูปภายใน, แล้วกลับไปที่ลูปแรกหากเป็นไปได้