Pętle w gnieździe

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

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.

  • Zewnętrzna pętla: kod biegnie linijnie, aż dotrze do zewnętrznej pętli.
  • Zewnętrzna pętla: kod biegnie linijnie, aż dotrze do zewnętrznej pętli.
  • Zewnętrzna pętla: kod biegnie linijnie, aż dotrze do zewnętrznej pętli.

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

  1. Utwórz nowy skrypt w ServerScriptService nazyającym się PartMaker. Kopiuj kod poniżej.


    local numberOfBatches = 7
    local partsPerBatch = 5
    local partsMade = 0
    -- Tworzy jeden kostka
    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
    -- Z zewnętrznym pętlem
    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))
    -- Wewnętrzny pętel
    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. Oglą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.

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

  2. Utwórz nowy skrypt o nazwie TowerBuilder. Dodaj zmienne dla wielkości wieży i rozmiaru kostki w górze.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
  3. Dodaj lokalną funkcję nazyającą się makeCube(), która tworzy pojedynczy kostka kubeł używając 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 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 = currentColor
    end
  5. Na 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 = currentColor
    cube.Parent = workspace
    end

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

  1. W makeCube() dodaj parametry dla spawnX , spawnY i 1> spawnZ1>. Te numery ustawią lokalizację 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. Wewną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 = currentColor
    cube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)
    cube.Parent = workspace
    end

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.

  1. 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 do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. Z 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 do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    for lengthIndex = 1, TOWER_SIZE do
    local spawnX = lengthIndex * CUBE_SIZE
    end
    end
  3. Wewną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 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ż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 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. Uruchom 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