중첩된 루프

*이 콘텐츠는 AI(베타)를 사용해 번역되었으며, 오류가 있을 수 있습니다. 이 페이지를 영어로 보려면 여기를 클릭하세요.

중첩 루프를 사용하면 일괄 처리로 작업을 반복할 수 있습니다. 예를 들어, 6개의 컵케이크 배치 또는 2개 팀의 플레이어에게 무기를 할당하는 것입니다.

중첩 루프가 실행되는 방법

루프가 중첩되면 스크립트는 다음 루프에 도달할 때까지 줄마다 실행됩니다.내부 루프는 외부 루프로 돌아가기 전에 조건이 충족될 때까지 실행됩니다.

중첩된 루프 논리

다음 그림에서는 루프가 수행하는 단계를 보여줍니다.

  • 외부 루프: 코드는 내부 루프에 도달할 때까지 줄 단위로 실행됩니다.:
  • 외부 루프: 코드는 내부 루프에 도달할 때까지 줄 단위로 실행됩니다.:
  • 외부 루프: 코드는 내부 루프에 도달할 때까지 줄 단위로 실행됩니다.

중첩 루프 예시

중첩된 루프는 약간 추상적으로 보일 수 있으므로 시각적 예제가 돕다될 수 있습니다.이 연습에서는 샘플 스크립트를 복사하고 붙여넣고 Studio에서 실행합니다.이 스크립트는 부품의 타워를 생성합니다.외부 루프는 만들 부품 수를 제어하고, 내부 루프는 실제 배치를 생성합니다.

  1. Create a new script in ServerScriptService named PartMaker. 아래 코드를 복사합니다.


    local numberOfBatches = 7
    local partsPerBatch = 5
    local 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 = currentColor
    part.Parent = workspace
    end
    -- 외부 루프
    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))
    -- 내부 루프
    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. 스크립트가 다른 색상의 부품 배치를 생성하는 것을 지켜보세요.한 번의 배치를 통과한 후에는 2초 동안 일시 중지됩니다.외부 루프의 인쇄 문은 내부 루프가 완료될 때마다 한 번만 실행됩니다.

루프 타워에 중첩됨

각 루프에는 자체 코드 집합이 있으므로 다른 작업에 책임을 질 수 있습니다.중첩 루프가 수행할 수 있는 한 가지는 개체가 스폰하는 위치를 변경하여 이 비디오의 타워와 같은 타워를 만드는 것입니다.너비, 길이 및 높이의 타워에서 큐브가 생성되는 위치를 제어하는 데 각각 3개의 다른 루프가 있습니다.

큐브 제작자 스크립트 코딩

중첩 루프를 연습하려면 큐브 타워를 생성하는 스크립트를 만듭니다.큐브 타워 스크립트에서는 먼저 단일 큐브를 생성하는 함수를 코딩합니다.타워는 이 함수를 반복적으로 호출하여 구축됩니다.

스크립트 설정

큐브 타워 스크립트의 경우 먼저 단일 큐브를 생성하는 함수를 코딩합니다. 타워는 이 함수를 반복적으로 호출하여 구축됩니다.

  1. 파트 메이커 스크립트를 삭제하거나 비활성화(스크립트 속성에서 비활성화 확인) 그렇지 않으면 동일한 플레이스동시에 부품을 만드는 두 개의 스크립트가 있을 것입니다.

  2. 타워 빌더라는 새 스크립트를 만들고 상단에 타워 크기와 큐브 크기에 대한 변수를 추가합니다.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
  3. makeCube()를 사용하여 단일 정사각형 큐브를 생성하는 로컬 함수 CUBE_SIZE를 추가합니다.


    local TOWER_SIZE = 4
    local CUBE_SIZE = 2
    -- 개별 큐브 생성
    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    end
  4. 큐브의 색을 중첩된 루프에서 업데이트될 변수로 설정합니다.


    local function makeCube()
    local cube = Instance.new("Part")
    cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)
    cube.Color = currentColor
    end
  5. 마지막으로, 부모 새 큐브를 작업 영역에 추가하여 표시합니다.


    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

다른 방향으로 스폰

타워를 생성하려면 각 새 큐브의 X, Y, Z 속성을 설정하여 특정 지점에 큐브를 스폰합니다. X와 Z는 측면입니다. Y는 위와 아래입니다.

  1. 에서 makeCube() , spawnX , spawnYspawnZ 의 매개 변수를 추가하십시오. 이 숫자는 각 새 큐브의 스폰 위치를 설정합니다.


    -- 개별 큐브 생성
    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. 함수 내에서 spawnX, spawnY, spawnZ 매개 변수를 사용하여 큐브의 CFrame 속성을 새 CFrame으로 설정합니다.


    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

중첩된 루프로 스폰하기

스크립트에는 길이, 너비 및 높이의 타워에 대한 각각 하나의 루프가 총 3개 있습니다.위쪽으로 이동하기 전에 전체 층을 완료하려면 먼저 가장 바깥쪽 루프에서 Y 좌표를 설정하십시오.

  1. 함수 아래에서, 각 큐브가 생성되는 방법을 설정하기 위한 for 루프를 만듭니다.

    • 제어 변수 : heightIndex = 1
    • 종점 : TOWER_SIZE
    • 루프 내에서 추가: local spawnY = (heightIndex - 1) * CUBE_SIZE

    -- 타워 빌드
    for heightIndex = 1, TOWER_SIZE do
    local spawnY = (heightIndex - 1) * CUBE_SIZE
    end
  2. 높이에 대한 첫 번째 루프가 완료되면 두 번째로 시작합니다.처음 루프 내에서 큐브를 배치할 위치에 대한 새 루프를 추가하십시오. Inside the first for loop, add a new for loop for where to place the cube along the length of the tower.

    • 제어 변수 : 길이 인덱스 = 1
    • 종점 : TOWER_SIZE
    • 이 루프 내에서 추가: 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. 내부 두 번째 루프에서 타워의 너비 를 위한 루프를 추가하십시오.이 마지막 루프에서 makeCube() 을 호출하고 X,Y,Z 매개변수를 전달합니다.

    • 제어 변수 : widthIndex = 1
    • 종점 : TOWER_SIZE
    • 루프 내에 추가:
      • local spawnZ = widthIndex * CUBE_SIZE
      • makeCube(spawnX, spawnY, spawnZ)
      • 0.25초의 대기 시간으로 타워가 건설되는 것을 지켜볼 수 있습니다.

    -- 타워 빌드
    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. 각 층이 랜덤 색상이 되도록 하려면 새 층을 만드는 동일한 루프에서 currentColor를 랜덤 RGB 숫자로 변경하십시오.


    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. 프로젝트를 실행하고 출력 창에 오류가 없이 전체 타워가 생성되었는지 기다립니다.

선택적 도전

아래에는 다양한 방식으로 중첩 루프를 사용하는 다양한 자기 주도 도전이 있습니다. 솔루션을 보기 전에 직접 시도하고 코드를 작성하십시오.

부품 사라지기

타워가 건설되면 왼쪽에서 오른쪽으로 부품이 투명도로 사라집니다.

코드 솔루션은 아래에 있습니다.


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

개체 빗발 뿌리기

부품 대신 실제 개체를 생성해 보세요. 여기서는 컵케이크를 사용했습니다.

보유확인해서 다음을 수행할 수 있는지 확인하십시오:

  • 기본 부품으로부터 개체를 생성합니다. 개체가 분해되지 않도록 모든 부품을 접합하십시오.
  • 서버 저장소에 개체 배치
  • 부품 대신 개체를 사용하도록 중첩 루프 예제에서 찾은 파트메이커를 수정합니다. 중첩 루프 예제에서 부품 대신 개체를 사용하도록 파트메이커를 수정합니다.

여기에 샘플이 표시됩니다.

컵케이크를 사용하는 코드 솔루션이 포함됩니다.


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

요약

더 복잡한 작업을 수행하려면 코더는 여러 루프를 결합하거나 심지어 다른 유형의 루프를 결합하는 것이 유용하다고 생각할 것입니다.모든 루프는 중첩될 수 있으므로 한 루프가 다른 루프 내에 있게 됩니다.중첩된 루프는 다른 루프와 동일한 논리를 따릅니다.첫 번째이자 가장 바깥쪽 루프에서 시작하여 내부 루프를 통해 태스크를 실행한 다음 해당경우 첫 번째 루프로 다시 순환합니다.