Gniazujące pętli umożliwiają powtarzanie zadań w partiach. Na przykład, pieczenie trzech partii sześciu muffinków lub przypisywanie broni graczom w dwóch zespołach.
Jak zagnęzone pętle biegną
Gdy pętle są gniażdżone, skrypty będą linijnie do końca, aż dotrą do następnej pętli. Wewnętrzna pętla będzie działać, dopóki jej nie spełniony warunek, zanim powróci do zewnętrznej pętli.
Zwój logiczny z pętlami
Poniższy diagrama pokazuje kroki, które przejmuje pętla.
|
Przykład pętli złożonej
Złożone pętle mogą wydawać się nieco abstrakcyjne, więc przykład wizualny może pomagać. Dla tego ćwiczenia kopiuj i wklej przykładowy skrypt i wykonaj go w Studio. Ten skrypt stworzy wieże części. Zewnętrzna pętla będzie kontrolować ilość części do zrobienia, a wewnętrzna pętla będzie tworzyć rzeczywistą partię.
Utwórz nowy skrypt w ServerScriptService nazyającym się PartMaker. Kopiuj kod poniżej.
local numberOfBatches = 7local partsPerBatch = 5local partsMade = 0-- Tworzy jeden kostkalocal 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-- Z zewnętrznym pętlemfor 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))-- Wewnętrzny pętelfor 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)endOglądaj, jak skrypt generuje różną partę kolorów. Po przejściu przez jedną partę, zatrzyma się na 2 sekundy. Statystyka drukowania w zewnętrznym pętli będzie działać tylko raz na każde ukończone wewnętrzne pętli.
Zaklęty dla Wieży Loop
Każdy pętel ma swoje własne zestawy kodu, więc może być odpowiedzialny za różne zadania. Jeden z rzeczy, które pętla zapasuje, to zmiana położenia, w którym pojawia się obiekt, aby stworzyć wieżę, jak ta w tym filmie. Są trzy różne pętle, jedna dla każdej kontroli tego, gdzie poziom kostki i wysokość względem wysokości i szerokości wieży.
Kodowanie kubeł Maker
Aby ćwiczyć pętli gniazowe, stworzysz skrypt, który tworzy wieżę kubów. Dla skryptu wieży kubów najpierw zaznacz funkcję, która tworzy pojedynczy kub. Wieża zostanie zbudowana poprzez powtarzanie tego funkcjonowania.
Konfiguracja Skryptu
Dla skryptu wieży kostki pierwszy kod funkcji, która tworzy pojedynczą kostkę. Wieża zostanie zbudowana poprzez powtarzalne wezwanie tej funkcji.
Usuń skryptę PartMaker lub wyłącz ją (w właściwościach skryptu, sprawdź Niepełnosprawni). Jeśli nie, będzie dwie skrypty tworzące części w tym samym miejsce.
Utwórz nowy skrypt o nazwie TowerBuilder. Dodaj zmienne dla wielkości wieży i rozmiaru kostki w górze.
local TOWER_SIZE = 4local CUBE_SIZE = 2Dodaj lokalną funkcję nazyającą się makeCube(), która tworzy pojedynczy kostka kubeł używając 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 aktualizowana w pętliach zeszywanych.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorendNa koniec rodzice nowy kubus do przestrzeni roboczej, aby wyglądał.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
Pojawianie się w różnych kierunkach
Aby stworzyć wieżę, wytwórz kostki na określonych punktach, ustawiając właściwości X, Y i Z każdego nowego kostka. X i Z są po obu stronach. Y jest w górę i w dół.
W makeCube() dodaj parametry dla spawnX , spawnY i 1> spawnZ1>. Te numery ustawią lokalizację 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 = workspaceendWewnątrz funkcji ustaw czerwoną flagę funkcji na nową czerwoną flagę funkcji, używając spawnX, spawnY, spawnZ parametrów.
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
Generowanie z pętlami zagnęszczonymi
Skrypt będzie miał trzy pętle w sumie, jedna dla długości, szerokości i wysokości wieży. Aby ukończyć cały piętro przed ruchem w górę, zacznij od ustawienia Y w pierwszym, zewnętrznym pętlu.
Pod funkcją makeCube() tworzono pętło do pętli, aby ustawić, jak wysoki każdy kostka spawneje.
- Zmienne sterowanie : heightIndex = 1
- Koniec punktu : TOWER_SIZE
- W środku funkcji dodawać: lokalny spawnY = (wysokośćIndeksu - 1) * CUBE_SIZE
-- Buduje wieżęfor heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEendZ pierwszym pętlem dla wysokości skończony, zacznij od drugiego. W pierwszym pętlem dla pętła dodaj nowy dla pętła, gdzie umieścić kostkę w długości wieży.
- Zmienne sterowanie : lengthIndex = 1
- Koniec punktu : TOWER_SIZE
- dodawaćwewnątrz tego cyklu: local spawnX = lengthIndex * CUBE_SIZE
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendendWewnątrz drugiego pętla, dodaj trzeci dla pętla dla wieży szerokości . W tym końcowym pętlu, wezwij 1> makeCube()1> i przekaż w parametrach X, Y i Z.
- Zmienne sterowanie : widthIndex = 1
- Koniec punktu : TOWER_SIZE
- W środku funkcji dodawać:
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- Czas oczekiwania 0,25 sek. abyś mógł zobaczyć, jak wieża zostanie zbudowana.
-- 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żdy piętro było losowym kolorem, zmień currentColor na losowy RGB liczby w tym samym pętlu, w którym tworzysz nowy 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)endendendUruchom projekt i poczekaj, aż stworzono pełną wieżę bez żadnych błędów w oknie wyjścia.
Opcjonalne wyzwania
Poniżej znajdują się różne samodzielne wyzwania, które używają pętli w różny sposób. Spróbuj i napisz własny kod przed podjęciem próby rozwiązania.
Znikające części
Gdy wieża jest budowana, spraw, aby części znikały z przejrzystości z 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żde pętli, które zaczynają 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
Rain Down Objekty
Zamiast części, spróbuj stworzyć prawdziwy obiekt. Tutaj przykład użył kokosówki.
Sama zobacz, czy możesz:
- Utwórz obiekt z podstawowych części. Upewnij się, że spawisz wszystkie części, aby obiekt nie rozpadł się.
- Umieść obiekt w SerwerzeStorage
- Modyfikuj części znalezione w Nested Loop Example, aby użyć swojego obiektu zamiast części.
Tutaj pokazano przykład.
Zawiera się rozwiązanie kodowe używające cupcakes.
local numberOfBatches = 30
local cupcakesPerBatch = 6
local cupcakesBaked = 0
--Tworzy pojedynczy szejk
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
-- Z zewnętrznym pętlem
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))
-- Wewnętrzny pętel
for cupcakeNumber = 1, cupcakesPerBatch do
makeCupcake()
print("Inner loop: cupcake " .. cupcakeNumber)
-- Pączki ścieżkowe w piecu
cupcakesBaked += 1
task.wait(0.5)
end
print("Bottom outer loop: " .. cupcakesBaked .. " cupcakes baked so far.")
end
Podsumowanie
Aby wykonać bardziej skomplikowane zadania, kodowanie będzie pomocne, aby łączyć wiele pętli i nawet różne rodzaje pętli. Wszystkie pętli można łączyć, co oznacza, że jedna pętla jest w innym. Pętli pętli mogą być nazwane w ten sam sposób, co każda inna pętla. Zaczyna się od pierwszej, najbardziej zewnętrznej pętli i wykonuje zad