Pętle gniazda pozwalają powtarzać zadania w partiach. Na przykład pieczenie trzech partii sześciu muffinek lub przypisywanie broni graczom na dwóch drużynach.
Jak wykonywane są pętle warstwowe
Gdy pętle są hierarchiczne, skrypty przechodzą linii po linii, aż dotrą do następnej pętle.Pętla wewnętrzna będzie uruchamiana, dopóki nie zostanie spełniony jej warunek, zanim powróci do zewnętrznej pętli.
Logika pędzla z gniazda
Poniższy diagram pokazuje kroki, jakie wykonuje pętla.
| ![]() |
Przykład gniazda pętli
Powiązane pętle mogą wydawać się nieco abstrakcyjne, więc przykład wizualny może pomagać.Do tego ćwiczenia skopiuj i wklej przykładowy skrypt i uruchom go w Studio.Ten skrypt utworzy wieże części.Zewnętrzna pętla będzie kontrolować, ile części należy wykonać, podczas gdy wewnętrzna pętla stworzy rzeczywistą partię.
Stwórz nowy skrypt w ServerScriptService o nazwie PartMaker. Skopiuj kod poniżej.
local numberOfBatches = 7local partsPerBatch = 5local partsMade = 0-- Tworzy pojedynczy kubeł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-- Zewnętrzna pętlafor 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))-- Pętla wewnętrznafor 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)endObserwuj, jak skrypt generuje inny zbiór kolorowych części.Po przejściu przez jedną partię zatrzyma się na 2 sekundy.Oświadczenie druku w pędzie zewnętrznym będzie uruchamiane tylko raz na zakończony pętli wewnętrzny.
Zagnieżdżony dla wieży pętla
Każdy cykl ma swój własny zestaw kodu, więc może być odpowiedzialny za różne zadania.Jedną rzeczą, którą można zrobić za pomocą pędzli nestowanych, jest zmiana położenia, w którym obiekt się pojawia, aby stworzyć wieżę taką jak w tym wideo.Istnieją trzy różne pętle, jedna dla każdej kontroli, gdzie wzdłuż szerokości, długości i wysokości wieży pojawia się kostka.
Zrealizuj skrypt twórcy kostki
Aby praktykować zamknięte pętle, utworzysz skrypt, który tworzy wieżę kostek.Dla skryptu wieży kostowej najpierw napisz funkcję, która generuje pojedynczy kostek.Wieża zostanie zbudowana poprzez powtarzalne wezwanie tej funkcji.
Ustaw skrypt
Dla skryptu wieży kostowej najpierw napisz funkcję, która generuje pojedynczy kostek. Wieża zostanie zbudowana poprzez powtarzalne wezwanie tej funkcji.
Usuń skrypt PartMaker lub wyłącz go (w właściwościach skryptu, sprawdź Wyłączone).Jeśli tego nie zrobisz, będą dwa skrypty wykonywać części jednocześnie w tym samym miejsce.
Stwórz nowy skrypt o nazwie TowerBuilder. Dodaj zmienne dla rozmiaru wieży i rozmiaru kostki na górze.
local TOWER_SIZE = 4local CUBE_SIZE = 2Dodaj lokalną funkcję o nazwie makeCube(), która tworzy pojedynczy kwadratowy kubeł za pomocą CUBE_SIZE.
local TOWER_SIZE = 4local CUBE_SIZE = 2-- Tworzy pojedyncze kostkilocal function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)endUstaw kolor kostki do zmiennej, która zostanie zaktualizowana w cyklach hierarchicznych.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorendWreszcie, rodzic nowy kubeł do przestrzeni roboczej, aby się pojawił.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
Pojaw się w różnych kierunkach
Aby stworzyć wieżę, wygeneruj kostki na określonych punktach, ustawiając właściwości X, Y, Z każdego nowego kostka. X i Z są obok siebie. Y jest w górze i w dół.
W makeCube(), dodaj parametry dla spawnX, spawnY i spawnZ. Te liczby określą lokalizację spawnowania każdego nowego kubu.
-- Tworzy pojedyncze kostkilocal function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceendW funkcji ustaw właściwość CFrame kostki do nowego CFrame za pomocą parametrów 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
Rozpoczynaj z gniazkowymi pędzlami
Skrypt będzie miał łącznie trzy pętle, jedną dla długości, szerokości i wysokości wieży.Aby ukończyć całe piętro przed przesunięciem w górę, zacznij od ustawienia koordynaty Y w pierwszym, najbardziej zewnętrznym pędzie.
Pod funkcją makeCube() twórz pętelę for, aby ustawić, jak wysoko każdy kubek się pojawia.
- Zmienna kontroli : heightIndex = 1
- Punkt końcowy : TOWER_SIZE
- W środku pętla dodawać: local spawnY = (index wysokości - 1) * CUBE_SIZE
-- Buduje wieżęfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEendZ pierwszym pętlą dla wysokości skończoną, rozpocznij drugą.W pierwszym cyklu for dodaj nowy cykl for do umieszczenia kostki wzdłuż wysokości wieży.
- Zmienna kontroli : lengthIndex = 1
- Punkt końcowy : TOWER_SIZE
- W tej pętli dodawać: lokalne spawnX = lengthIndex * CUBE_SIZE
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendendW środku pętli druga dodaj trzecią dla pętli dla wieży szerokość .W tym ostatnim cyklu wezwij makeCube() i przekaż parametry X, Y, Z.
- Zmienna kontroli : widthIndex = 1
- Punkt końcowy : TOWER_SIZE
- W środku pętla dodawać:
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- Czas oczekiwania 0,25, abyś mógł obserwować, jak budowana jest wieża.
-- Buduje wieżę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)endendendAby każde piętro było losowym kolorem, zmień currentColor na losowe RGB liczby w tym samym cyklu, w którym tworzysz nowe piętro.
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)endendendWykonaj projekt i poczekaj, aż zostanie utworzona pełna wieża bez żadnych błędów w oknie wyjścia.
Opcjonalne wyzwania
Poniżej znajdują się różne samodzielne wyzwania, które wykorzystują gniazdzone pętle w różny sposób. Spróbuj i skoduj samodzielnie, zanim przejrzysz rozwiązanie.
Zniknij części
Gdy wieża jest budowana, części znikają w przejrzystości od lewej do prawej.

Rozwiązanie kodowe jest poniżej.
local TOWER_SIZE = 6
local CUBE_SIZE = 2
-- Tworzy pojedyncze kostki
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 -- Ustawia przejrzystość
cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
cube.Parent = workspace
end
-- Buduje wieżę
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 --Aktualizuje każdą pętlę rozpoczynającą się od 0
for widthIndex = 1, TOWER_SIZE do
local spawnZ = widthIndex * CUBE_SIZE
makeCube(spawnX, spawnY, spawnZ)
task.wait(0.05)
end
end
end
Spadające obiekty deszczu
Zamiast części, spróbuj wygenerować rzeczywisty obiekt. Przykład tutaj użył babeczek.
Na własną posiadać, sprawdź, czy możesz:
- Stwórz obiekt z części bazowych. Upewnij się, że połączysz wszystkie części, aby obiekt nie rozpadł się.
- Umieść obiekt w ServerStorage
- Dostosuj częściarkę znalezioną w Przykładzie zamkniętego cyklu, aby używać twojego obiektu zamiast części.
Przedstawiono tutaj próbkę.
Rozwiązanie kodowe wykorzystujące pączki jest włączone.
local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--Tworzy pojedynczą muffinkę
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
-- Zewnętrzna pętla
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))
-- Pętla wewnętrzna
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("Inner loop: cupcake " .. cupcakeNumber)
-- Pieczone muffinki śledzące
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end
Podsumowanie
Aby wykonać bardziej skomplikowane zadania, programiści znajdą pomocne połączenie wielu pętli, a nawet różnych rodzajów pętli.Wszystkie pętle mogą być hierarchiczne, co oznacza, że jedna pętla jest w środku innej.Pętle nestowane podążają za taką samą logiką jak każda inna pętla.Zaczyna się w pierwszej, najbardziej zewnętrznej pętli, wykonuje zadania za pomocą pętli wewnętrznych, a następnie powraca do pierwszej pętli, jeśli jest to mające zastosowanie.