중첩 루프를 사용하면 작업을 반복할 수 있습니다. 예를 들어, 6개의 컵케이크 배치 또는 두 팀의 플레이어에게 무기 할당.
중첩된 루프 실행
루프가 중첩되면 스크립트는 다음 루프에 도달할 때까지 줄이 됩니다. 내부 루프는 외부 루프에 조건이 충족될 때까지 실행됩니다.
중첩된 루프 논리
다음 그림에서는 루프가 수행하는 단계를 보여줍니다.
|
중첩 루프 예시
중첩 루프는 약간 개념적일 수 있으므로 시각적 예시가 돕다될 수 있습니다. 이 예시에서는 샘플 스크립트를 복사하고 Studio에서 실행하여 부품 탑을 만듭니다. 외부 루프는 부품을 만들기 위해 얼마나 많은 부품을 만들지 제어하고 내부 루프는 실제 배치를 만듭니다.
서버스크립트서비스의 새 스크립트 PartMaker 를 만듭니다. 아래의 코드를 복사하십시오.
local numberOfBatches = 7local partsPerBatch = 5local 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 = currentColorpart.Parent = workspaceend-- 외부 루프for 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))-- 내부 루프for 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)end스크립트가 다른 색의 부품을 생성하는 동안 시작합니다. 한 번의 색 부품 배치를 완료한 후 2초 동안 중지됩니다. 외부 루프에서 인쇄 문을 실행할 때마다 완료된 내부 루프에 대해 실행됩니다.
루프 타워를 위해 중첩
각 루프는 코드 집합을 가지므로 서로 다른 작업에 책임을 맡길 수 있습니다. 하나의 중첩된 루프는 개체 생성 위치를 변경하여 이 비디오에 있는 타워와 같은 타워를 만들 수 있습니다. 이 비디오에서 볼 수 있듯이 쿠브 생성의 너비, 높이 및 높이는 모두
큐브 제작자 스크립트 작성
중첩 루프를 연습하려면 하나의 큐브 타워를 생성하는 스크립트를 작성합니다. 큐브 타워 스크립트에 대해 첫 번째 코드는 단일 큐브를 생성하는 함수를 만듭니다. 탑은 이 함수를 반복하여 건설됩니다.
스크립트 설정
큐브 타워 스크립트의 경우 단일 큐브를 생성하는 함수를 먼저 코드화합니다. 탑은 이 함수를 반복해서 호출하여 건설됩니다.
삭제 부품 제작 스크립트를 삭제하거나 비활성화(스크립트 속성에서 비활성화 선택)하십시오. 그렇지 않으면 두 개의 부품이 동시에 동일한 플레이스생성됩니다.
TowerBuilder라는 이름의 새로운 스크립트를 생성합니다. 상단에 타워 크기 및 큐브 크기를 변수로 추가합니다.
local TOWER_SIZE = 4local CUBE_SIZE = 2makeCube()라는 이름의 로컬 함수를 추가하여 CUBE_SIZE 를 사용하여 단일 정사각형 큐브를 생성합니다.
local TOWER_SIZE = 4local CUBE_SIZE = 2-- 개별 큐브 생성local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)end큐브의 색을 중첩된 루프에서 업데이트할 변수로 설정합니다.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorend마지막으로, 부모 새 큐브를 작업 공간에 부모를 지정하여 표시합니다.
local function makeCube()local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend
다른 방향으로 생성
타워를 생성하려면 각 새로운 큐브의 X, Y, Z 속성을 설정하여 특정 위치에서 큐브를 생성합니다. X와 Z는 측면에서 서로 맞닿습니다. Y는 위로 올라갑니다.
In makeCube() , add parameters for spawnX , spawnY , and 1> spawnZ1> . 이 숫자는 각 새로운 큐브의 스폰 위치설정합니다.
-- 개별 큐브 생성local function makeCube(spawnX, spawnY, spawnZ)local cube = Instance.new("Part")cube.Size = Vector3.new(CUBE_SIZE, CUBE_SIZE, CUBE_SIZE)cube.Color = currentColorcube.Parent = workspaceend함수 내에서 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 = currentColorcube.CFrame = CFrame.new(spawnX, spawnY, spawnZ)cube.Parent = workspaceend
중첩된 루프로 생성
스크립트에는 높이, 너비 및 높이의 타워의 길이, 너비 및 높이가 각각 3개 있습니다. 위로 이동하기 전에 전체 층을 완료하려면 첫 번째 외부 루프부터 시작하십시오.
makeCube() 함수 아래에서 루프를 만들어 각 큐브 생성에 대한 높이를 설정합니다.
- 변수 제어 : heightIndex = 1
- 종점 : TOWER_SIZE
- 루프 내에서 다음을 추가합니다. local spawnY = ( heightIndex - 1) * CUBE_SIZE
-- 타워 빌드for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEend높이를 완성한 첫 번째 루프로 시작하고 두 번째로 시작합니다. 첫 번째 루프로 시작 내에서 큐브를 길이 방향으로 배치하기 위해 새 루프를 추가합니다.
- 변수 제어: : lengthIndex = 1
- 종점 : TOWER_SIZE
- 다음을 추가합니다. local spawnX = lengthIndex * CUBE_SIZE
for heightIndex = 1, TOWER_SIZE dolocal spawnY = (heightIndex - 1) * CUBE_SIZEfor lengthIndex = 1, TOWER_SIZE dolocal spawnX = lengthIndex * CUBE_SIZEendend초 루프의 내부에서 타워 너비에 대한 루프를 위한 세 번째 를 추가합니다. 이 최종 루프에서 만들기 를 호출하고 X, Y, Z 매개 변수를 전달합니다.
- 변수 제어 : widthIndex = 1
- 종점 : TOWER_SIZE
- 루프 내에서 다음을 추가합니다.
- local spawnZ = widthIndex * CUBE_SIZE
- makeCube(spawnX, spawnY, spawnZ)
- 0.25초 동안 대기 시간으로, 타워를 건설할 수 있습니다.
-- 타워 빌드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)endendend각 층이 랜덤한 색상이 되도록 하려면 currentColor 를 랜덤 RGB 숫자로 변경 하세요.
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)endendend프로젝트를 실행하고 출력 창에서 오류가 없이 완전한 타워를 만든지 확인하십시오.
선택적 도전
다음은 서로 다른 방식으로 중첩된 루프를 사용하는 다양한 셀프 디렉트 도전입니다. 솔루션을 검토하기 전에 코드를 작성하십시오.
부품 사라지기
탑이 건설되면 부품이 왼쪽에서 오른쪽으로 투명도가 감소합니다.
코드 솔루션은 아래에 있습니다.
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
비가 내리는 개체
부품이 아닌 대신 실제 개체를 생성하십시오. 여기에서 컵케이크를 사용했습니다.
혼자 볼 수 보유확인하십시오.
- 기본 부품으로 개체를 생성하십시오. 모든 부품을 함께 붙여서 개체가 부서지지 않도록 하십시오.
- ServerStorage에 개체를 배치하십시오.
- 삽입 루프 예시에서 파트Maker를 수정하여 파트가 아닌 대신 개체를 사용하십시오.
여기에 샘플이 표시됩니다.
컵케이크를 사용하는 코드 솔루션이 포함되어 있습니다.
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
요약
더 복잡한 작업을 수행하려면 코더는 여러 개의 루프를 결합하는 것이 좋습니다. 심지어 다른 종류의 루프를 결합하는 것도 도움이 될 수 있습니다. 모든 루프는 중첩될 수 있습니다. 즉, 하나의 루프가 다른 루프의 안에 있습니다. 중첩된 루프는 모두 동일한 로