Pętle warstwowe

*Ta zawartość została przetłumaczona przy użyciu narzędzi AI (w wersji beta) i może zawierać błędy. Aby wyświetlić tę stronę w języku angielskim, kliknij tutaj.

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.

  • Zewnętrzna pętla: kod jest uruchamiany linii po linii, aż dotrze do wewnętrznej pętli.:
  • Pętla zewnętrzna: kod jest uruchamiany linii po linii, aż dotrze do pętli wewnętrznej.:
  • Zewnętrzna pętla: kod jest uruchamiany linii po linii, aż dotrze do wewnętrznej pętli.

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ę.

  1. Stwórz nowy skrypt w ServerScriptService o nazwie PartMaker. Skopiuj kod poniżej.


    local numberOfBatches = 7
    local partsPerBatch = 5
    local 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 = currentColor
    part.Parent = workspace
    end
    -- Zewnętrzna pętla
    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))
    -- Pętla wewnętrzna
    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. Obserwuj, 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.

  1. 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.

  2. Stwórz nowy skrypt o nazwie TowerBuilder. Dodaj zmienne dla rozmiaru wieży i rozmiaru kostki na górze.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
  3. Dodaj lokalną funkcję o nazwie makeCube(), która tworzy pojedynczy kwadratowy kubeł za pomocą CUBE_SIZE.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
    -- Tworzy pojedyncze kostki
    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    end
  4. Ustaw 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 = currentColor
    end
  5. Wreszcie, 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 = currentColor
    cube.Parent = workspace
    end

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ół.

  1. W makeCube(), dodaj parametry dla spawnX, spawnY i spawnZ. Te liczby określą lokalizację spawnowania każdego nowego kubu.


    -- 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.Parent = workspace
    end
  2. W 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 = currentColor
    cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
    cube.Parent = workspace
    end

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.

  1. 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 do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. Z 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 do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    end
    end
  3. W ś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 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. Aby 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 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. Wykonaj 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.